MySQL Вставить туда, где не существует запроса, не будет вставляться, если существует хотя бы одна строка

У меня довольно сложный запрос. У меня есть таблица с автомобильными деталями (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
)

person Tony    schedule 10.05.2013    source источник


Ответы (1)


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

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

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

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