как обновить таблицу с подзапросом в предложении where - PullRequest
2 голосов
/ 08 декабря 2011

У меня есть главная таблица categories, как это

categories_id | categories_status | parent_id
     1                  1               0
     2                  1               0
     3                  1               1
     4                  1               2
     5                  1               1
     6                  1               2

и справочная таблица products_to_categories

categories_id | products_id
      3             778
      3             998
      5             666
      5             744

Я выбираю все категории без дочерней категории:

SELECT * FROM categories
WHERE categories_id not in ( SELECT parent_id FROM categories )
# gets entries with id 3, 4, 5, 6

и нет продуктов в справочной таблице:

AND categories_id NOT IN ( SELECT categories_id FROM products_to_categories )
# gets entries with id 4, 6

Теперь я хотел бы обновить category_status для этого результата, но это не работает, просто изменив SELECT на UPDATE:

UPDATE categories
SET categories_status = 0
WHERE categories_id not in ( SELECT parent_id FROM categories )
AND categories_id NOT IN ( SELECT categories_id FROM products_to_categories )

Есть несколько похожих вопросов, но я не могу понять, как изменить свой пример ...

Спасибо и наилучшими пожеланиями,

Алекс

Ответы [ 2 ]

2 голосов
/ 08 декабря 2011

Вместо подзапросов используйте левое внешнее объединение

update 
categories c1
left outer join categories c2 on c1.ID = c2.Parent_id
left outer join products_to_categories p on c1.categories_id = p.categories_id
set c1.categories_status = 0
where c2.ID is null and p.categories_id is null
2 голосов
/ 08 декабря 2011

Вы не можете обновить записи, содержащиеся в подзапросе, где условия. Попробуйте использовать прямые условия, такие как:

// this rely that all categories_id higher than 0 should be valid relations
WHERE categories_id < 1

.. это должно работать, но я хотел бы дать вам совет, связанный с производительностью - используйте значения NULL в случае записей без родителей. Чем условие должно быть WHERE categories_id IS NULL

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...