0

ゴール:

channels.active=1アクティブ( )であるが0アクティブなアイテムがあるチャネルの結果が必要です。

ありitems、それらはに属しchannelます。items複数のチャネルを持つことができます。

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、アクティブアイテム用です。

4

2 に答える 2

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
    )
于 2013-01-08T21:39:14.587 に答える
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を動作させます。

于 2013-01-08T21:46:47.550 に答える