К списку форумов К списку тем
Регистрация    Правила    Главная форума    Поиск   
Имя: Пароль:
Рекомендовать в новости

Help SQL

Гость
0 - 20.01.2015 - 11:48
Доброго всем дня!
Проблема вот какая. Есть некая таблица
CREATE TABLE IF NOT EXISTS `ololo` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`kod` varchar(100) DEFAULT NULL,
`kolvo` float DEFAULT NULL,
`err` varchar(100) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=4 ;

Там есть и будут(оч на это надеюсь)
INSERT INTO `ololo` (`id`, `kod`, `kolvo`, `err`) VALUES
(1, '123', 5, NULL),
(2, '123', 5, NULL),
(3, '321', 1, NULL);

Необходимо написать запрос который будет проверять дубли. Т.е если kod и kolvo есть в таблице совершать update err = 'ОШИБКА'

Вот этот запрос выдаёт мне эти айдишки
select `o1`.`id` from `ololo` as `o1` where exists (select * from `ololo` as `o2` where o2.id <> o1.id and o2.kod = o1.kod)

А вот этот запрос не хочет выполняться

UPDATE ololo SET err = 'ОШИБКА' WHERE id IN (select `o1`.`id` from `ololo` as `o1` where exists (select * from `ololo` as `o2` where o2.id <> o1.id and o2.kod = o1.kod));

Выдает вот чего
#1093 - You can't specify target table 'ololo' for update in FROM clause

Как можно решить данную проблему?



Гость
1 - 20.01.2015 - 12:12
Я не уверен, но возможно что селект лочит строки в мускул и поэтому не дает изменять таблицу, вобщее так делать нехорошо.
Этот код вызывается откуда? php?
Можете сделать процедуру, которая будет вытаскивать идентификаторы и потом либо в цикле либо через динамический SQL обновлять поле ERR
Гость
2 - 20.01.2015 - 12:16
http://www.sql.ru/forum/876053/vechn...specify-target
Гость
3 - 20.01.2015 - 12:28
1-40KHYTbIU > СПАСИБО ОГРОМНОЕ
вот тоже такое подозрение)))) видимо придётся разбить на 2 части... выборка этого самого запроса которая будет этим самым in($peremen) а потом уже выполнять его.
Просто хотелось бы выделиться))) что можно это делать одним запросом.
Кстати если сделать копии таблицы и select для IN выполнять из неё все работает)))
Гость
4 - 21.01.2015 - 13:26
0-oleg747 > условная процедура:
if ("SQL select") then "error" else "SQL insert"
Где,
"SQL select" - запрос сведений из таблицы. Не такой как у Вас, а
select * from `ololo` where `id`=id, `kod`=kod, `kolvo`=kolvo, `err`=err
Смысл в том, что если запрос возвращает данные (есть такая строка) условие в блоке if получает ненулевое (true) значение (зависит от языка программирования).
"error" - код ошибки на вывод
"SQL insert" - добавление сведений.
Гость
5 - 21.01.2015 - 14:21
3-oleg747 > Решение в один запрос на основе ссылки из 2:

UPDATE ololo SET err = 'ERROR' WHERE id IN (select `mo`.`id` from (select `o1`.`id` from `ololo` as `o1` where exists (select * from `ololo` as `o2` where o2.id <> o1.id and o2.kod = o1.kod)) as `mo`);
Гость
6 - 21.01.2015 - 19:38
5-40KHYTbIU >
Код:
select `mo`.`id` from
зачем этот селект?)
Гость
7 - 21.01.2015 - 19:46
6-droidman > 2 читал?
Гость
8 - 21.01.2015 - 22:31
7-40KHYTbIU > прочёл, но там JOIN рекомендуют =)
Это я даже не заикалсо ещё про group/having вместо exists(select *
Гость
9 - 22.01.2015 - 08:11
5-40KHYTbIU > вот это ВАУ!!! Спасибо огромнейшее.
Получается к тому, что я написал нужно было добавить еще один селект?)))) здорово))))
Это действительно отрабатывает. И очень быстро. Нужно проверить как оно будет работать когда в таблице будет несколько тысяч строчек.
Еще раз спасибо огромное!!!
Гость
10 - 22.01.2015 - 14:45
8-droidman > Я говорил выше, что не знаю тонкостей MySQL, но ИМХО джоин будет дольше, мне так кажется.
И если вы такой грамотный, привели бы решение.
Гость
11 - 22.01.2015 - 18:01
10-40KHYTbIU > не, я чисто поумничать) сами мы тупые)
Просто никак не могу забыть случаев, когда люди связывали таблицы по строкам (а не ключам) и делали индексы от хэшей, превышающие размерами саму таблицу на диске. А денормализация была панацеей от всего, в том числе планирования ;)
Гость
12 - 23.01.2015 - 08:57
10-40KHYTbIU > join действительно отрабатывает значительно дольше!!! еще раз спасибо!!!


К списку вопросов
Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск




Copyright ©, Все права защищены