У меня довольно сложный запрос. У меня есть таблица с автомобильными деталями (parts_list, около 600 строк), которая содержит некоторую информацию о детали, например, ее название и зависит ли она от двигателя или нет. Для зависимости от двигателя у меня есть два разных запроса, так что это тот, который не зависит от двигателя (0, я сохраняю его как логическое значение). Большинство частей можно разобрать и разбить на несколько частей, поэтому я сохраняю части в виде дерева и в этом запросе беру только те части, которые нельзя разобрать (листья дерева). Эта таблица представляет собой только список возможных частей. Теперь для каждой модели автомобиля я сохраняю строку в другой таблице (детали) и склеиваю вместе part_list_id и model_id, а затем цену и количество. Теперь, если я запущу запрос, он успешно сгенерирует около 500 строк (взяв только листовые части) в таблице «части» и сделает то, что мне нужно. Около 500 (листовых) деталей для id модели. Но иногда я генерирую строку для другой модели для конкретной детали. И тогда запрос не делает остальные 499 строк. Это работает только в том случае, если запрос выбора WHERE NOT EXISTS возвращает 0. Если хотя бы одна строка существует, остальные не вставляются. Но для меня это не имеет смысла, потому что разве он не должен проверять разные значения, как в цикле?
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
)