2013-05-10 4 views
1

У меня довольно сложный запрос. У меня есть таблица с автозапчастями (parts_list, около 600 строк), которая содержит некоторую информацию о части, подобной ее названию, и если она зависит от двигателя или нет. Для зависимости от двигателя у меня есть два разных запроса, так что это тот, у которого нет зависимости от двигателя (0, я сохраняю его как логическое). Большинство частей могут быть разобраны и разбиты на несколько частей, поэтому я сохраняю детали как дерево, и в этом запросе беру только те части, которые нельзя разобрать (листья деревьев). В этой таблице представлен только список возможных частей. Теперь для каждой модели автомобиля я сохраняю строку в другой таблице (части), и я привязываю parts_list_id и model_id вместе, а затем цену и количество. Теперь, если я запустил запрос, он успешно сгенерирует около 500 строк (принимая только части листа) в таблице «части», и он будет делать то, что мне нужно. Около 500 (листовых) частей для идентификатора модели. Но иногда я создаю строку для другой модели для определенной части. И тогда запрос не делает остальные 499 строк. Он работает только в том случае, если WHERE NOT EXISTS select query возвращает 0. Если даже одна строка существует, она не вставляет остальные. Но это не имеет смысла для меня, потому что не следует ли проверять его с разными значениями, такими как цикл?MySQL Вставить, где не существует запрос, не будет вставляться, если существует хотя бы одна строка

INSERT INTO parts (parts_list_id, model_id, motor_id) 
SELECT  orig1.id, '" . $this->model_id . "', '0' 
FROM  parts_list AS orig1 
LEFT JOIN parts_list AS orig2 ON (orig1.id = orig2.parent_id) 
WHERE  orig2.id IS NULL 
AND   orig1.motor_dependent = '0' 
AND NOT EXISTS (
    SELECT  t1.id 
    FROM  parts_list AS t1 
    LEFT JOIN parts_list AS t2 ON (t1.id = t2.parent_id) 
    LEFT JOIN parts ON (parts.parts_list_id = t1.id) 
    WHERE  t2.id IS NULL 
    AND   t1.motor_dependent = '0' 
    AND   parts.parts_list_id = t1.id 
    AND   parts.model_id = :model_id 
) 

ответ

0

Ну, заявление sql кажется прекрасным. Если есть одна строка, NOT EXISTS возвращает false. И это правильно. Ни одна строка не вставлена. Возможно, вы хотите поместить несколько разных проверок, используя parts_list_id NOT IN (ваш подзапрос) вместо NOT EXISTS.

NOT EXISTS выражает условие для набора в целом, NOT IN используется для определения того, имеет ли набор правильные элементы.

Я надеюсь получить это правильно. Немного сложно понять ваш домен только из одного заявления.

+0

Спасибо, я не знал, что NOT EXIST является глобальным для всех строк. Мне удалось обработать его, заблокировав оба идентификатора - один из подзапроса в предложении WHERE NOT EXISTS и один из запроса SELECT. Но в любом случае я не использую правильное ключевое слово. NOT IN - это то, что следует использовать. – Tony

+0

добро пожаловать к приятному дню – gpicchiarelli

Смежные вопросы