2015-10-29 103 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

哪個RDBMS是這個呢?請添加一個標籤來指定您是使用'mysql','postgresql','sql-server','oracle'還是'db2' - 或者其他的東西。 –

+1

對我來說似乎完全沒問題;這是我最有可能做到的 – HoneyBadger

+1

用'AND 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

由於我們正在討論優化:我們可以先在news_cats上進行篩選,然後再加入。但是,這可能會由優化器自動完成。 – flowit

+0

你也可以寫INNER JOIN – Mihai

+0

如果一個id有多行,如果一行中的「news_cats.cat_id = 2」爲true,原始查詢不返回任何一行。但是,您的查詢返回該ID的行,而不是該行。 – jarlh