2013-01-08 52 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