2015-10-29 2 views
-1

Подпишитесь здесь. Новость может принадлежать многим категориям или вообще не имеет категории. Мне нужно запросить все новости, которые не относятся к определенной категории (т. Е. 2) (Если новости относятся к категориям 2 и 3, мы все равно этого не хотим).Можно ли улучшить этот SQL-запрос?

Кажется, я решил это таким образом, но я не очень разбираюсь в SQL, поэтому буду очень благодарен за любые идеи и критику. Извините, может быть, тривиальный и неинтересный вопрос.

SELECT * FROM news n 
LEFT JOIN news_cats nc ON n.id = nc.cat_id 
WHERE n.id NOT IN (SELECT news_id FROM news_cats WHERE news_cats.cat_id = 2) 
GROUP BY n.id; 
+0

Какой РСУБД это? Добавьте тег, чтобы указать, используете ли вы 'mysql',' postgresql', 'sql-server',' oracle' или 'db2' - или что-то еще. –

+1

Кажется мне прекрасно; это, как я, скорее всего, сделал бы это – HoneyBadger

+1

Замените все там WHERE с подзапросом с 'И news_cats.cat_id! = 2' – Mihai

ответ

1
SELECT * FROM news n 
LEFT JOIN news_cats nc ON n.id = nc.cat_id 
WHERE news_cats.cat_id <> 2 
GROUP BY n.id; 
+0

Поскольку мы говорим об оптимизации: мы можем сначала фильтровать новости и добавлять их позже. Но, вероятно, это будет сделано автоматически оптимизатором. – flowit

+0

Вы также можете написать INNER JOIN – Mihai

+0

Если идентификатор имеет несколько строк, исходный запрос не возвращает ни одного из них, если «news_cats.cat_id = 2» истинно для одной строки. Но ваш запрос возвращает строки этого идентификатора, а не эту строку. – jarlh

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