У меня довольно сложный запрос. У меня есть таблица с автозапчастями (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
)
Спасибо, я не знал, что NOT EXIST является глобальным для всех строк. Мне удалось обработать его, заблокировав оба идентификатора - один из подзапроса в предложении WHERE NOT EXISTS и один из запроса SELECT. Но в любом случае я не использую правильное ключевое слово. NOT IN - это то, что следует использовать. – Tony
добро пожаловать к приятному дню – gpicchiarelli