2010-11-26 2 views
0

何かがとてもシンプルに見えますが、正しいクエリを見つけることができない場合があります。特定の多対多の関係がすでに存在するかどうかを調べるクエリを探しています。次の表を考えてみます。多対多の関係が存在するかどうかを確認するクエリ

 
    +---------+---------+ 
    | feed_id | coll_id | 
    +---------+---------+ 
    |  1 |  1 | 
    |  1 |  2 | 
    |  1 |  3 | 
    +---------+---------+ 

それはテーブルの間、多くの関係に多くのテーブルの「フィード」とテーブル「コレクション」。

コレクション1とコレクション2、そして1と2のみが存在するかどうかを確認するクエリが必要です。存在する場合は、そのfeed_idが必要です。

上記の表では、このフィードは存在しません。

クエリのより一般的な説明は、すべてのcoll_idを含むフィードを検索し、フィードに他のコレクションが含まれていないことです。 coll_idは確かfeed_id = 1は2を返しますCOUNT(*)(coll_id者の数という作りIN(1,2)

  • されていることを確認して

    1. :これは上記の例については、以下を意味します)

    手順2で問題となるのは、サブクエリでfeed_idの値を使用できないということです。

    私は間違ったトラックにいるのですか?

    ご協力いただければ幸いです。

  • 答えて

    1

    私は、これはすべての状況にお答えしますと思う:

    SELECT coll_id, feed_id 
    FROM a a1 
    GROUP BY coll_id 
    HAVING feed_id IN (2,4) 
    AND COUNT(*) = 2 
    AND NOT EXISTS (
        SELECT * 
        FROM a a2 
        WHERE a2.coll_id = a1.coll_id 
        AND feed_id NOT IN (2,4) 
    ) 
    

    私は私がやりましたこれらのデータを用いた試験:

    +---------+---------+ 
    | feed_id | coll_id | 
    +---------+---------+ 
    |  1 |  1 | 
    |  2 |  4 | 
    |  2 |  7 | 
    |  3 |  3 | 
    |  4 |  2 | 
    |  4 |  4 | 
    |  5 |  4 | 
    |  6 |  1 | 
    |  6 |  2 | 
    |  6 |  4 | 
    |  7 |  2 | 
    |  7 |  4 | 
    +---------+---------+ 
    
    のみcoll_id 4

    及び7は、図2及び図4に示すようfeed_id

    01を有しています

    私もfeed_idとテスト(1,2,4)は6とfeed_id(3)これに伴う問題は、私はfeed_idを知らないということである3

    パトリック

    +0

    ありがとうパトリック、このクエリはすごくうまく機能します! – wkjagt

    0

    私はこのクエリをテストしていない、と私はあなたが両方の列にUNIQUEキーを持っていると仮定します。

    SELECT feed_id 
    FROM t 
    WHERE feed_id = 1 AND coll_id IN (1,2) 
    GROUP BY feed_id 
    HAVING COUNT(coll_id) = 2 
    
    +0

    を返しました。私は '正確に' coll_idの1と2のフィードを探しているので、私はこのテーブルをIN(1,2)でクエリして、私に0行を返す必要があります。また、coll_id = 3であるため、Feed_id 1は返さないでください。 IN(1,2,3)で同じクエリを実行すると、feed_id 1が返されるはずです。 – wkjagt

    +0

    待ち時間、coll 1と2のみを持つ 'feed_id'のリストが必要ですか? – cambraca

    +0

    私はただの簡単なテストを実行しました。 'IN(1,2,3)'と 'HAVING COUNT(coll_id)= 3'(この数はあなたが' IN'で持っている項目の数でなければなりません)を実行すると動作します。 1つの 'feed_id 'に限定したくない場合は、' feed_id = 1 AND'をクエリから削除すれば、条件に一致する 'feed_id'のリストが返されます。 – cambraca