2013-01-08 72 views
0

目標:需要進行比較的子查詢?

需要有效通道的結果(channels.active=1),但有0有效項目。

items,它們屬於channelitems可以有多個通道。

有3個表:

  • channels
  • items
  • items_channels

items_channel地圖項頻道。例如行:

id item channel 
1 23  47 

到目前爲止,我只是有這個得到有效通道:

SELECT * FROM channels WHERE channels.active = 1

我無法把握的部分,我只參加有0有效的項目渠道 - 我是否需要一個子查詢或HAVING子句,其中某個地方的COUNT

另外,channels.active適用於活動頻道,items.active適用於活動項目。

+3

謝天謝地,SO沒有給出配置文件視圖的徽章。我猜那13,845人中有85%是因爲你的頭像。 – Kermit

回答

2

這應該爲你工作:

SELECT channels.* 
FROM channels 
LEFT JOIN items_channels 
    ON channels.id = items_channels.channel 
LEFT JOIN items 
    ON items_channels.item = items.id AND items.active = 1 
WHERE channels.active = 1 
GROUP BY channels.id 
HAVING COUNT(items.id) = 0 

工作sqlfiddle here

+0

我不知道mySql,但是這個查詢是否正確,沒有GROUP BY語句? – semao

+0

它實際上在MySQL中有效 - 但在沒有它的情況下它不會返回正確的結果。固定。 – PinnyM

+0

但是meder需要所有通道數據。這將需要使用嵌套查詢,對吧? – semao

3

這是你在找什麼?

SELECT * FROM channels c 
    LEFT OUTER JOIN items_channels ic ON c.channelID = ic.channelID 
    LEFT OUTER JOIN items i ON i.itemID = ic.itemID AND i.active = 1 
WHERE channels.active = 1 AND i.itemID IS NULL 

如果使用COUNT(),您將需要使用嵌套查詢:

SELECT * FROM channels c 
WHERE channels.active = 1 AND c.channelID IN 
    (
    SELECT ic.channelID FROM items_channels ic 
     LEFT OUTER JOIN items i ON i.itemID = ic.itemID 
     WHERE i.active = 1 
    GROUP BY ic.channelID 
    HAVING COUNT(ic.itemID) == 0 
    ) 
+1

你不需要第二次加入'items'。如果沒有項目,則連接表「items_channels」中沒有條目,因此您不想獲取項目詳細信息。或者如果OP想要「0有效項目」,則應該添加一個「i.active = 1」。 – Borealid

+0

我不需要它來檢查活動物品,Borealid?可以映射到不活動的項目。 'items.active'列決定是否激活。 –

+0

已更新的答案僅用於檢查活動項目。 – semao