2009-07-25 10 views
0

リンクテーブルから選択して余計な結果をフィルタリングする際に問題があります。MySQL - リンクテーブルから要素を取得しますが、それらの要素のみを取得します。

出版package_publicationsテーブルによってパッケージに属します。

たとえば、自分の出版物のIDが11と47であることを知っています。私はその中にそれらの出版物しか含まないパッケージを返すことにします。明白な内部結合した後、私はwhere publications.id IN (11, 47)のように参加してください何かをすれば

は今、これは単にpackage_publicationsリンクテーブル内でこれらの値のいずれかを持っているすべてのパッケージを返します。

私は両方が2つに限られていないパッケージ(またはそれ以上)にマッチしたいと思います。効果的に私はANDを必要とするときにORを使用していますが、SQLにアプローチする方法はわかりません。

答えて

0

あなたの最善の策は相関サブクエリです。もう1つの選択肢はdistinct/group byとの結合ですが、特に大きなテーブルではうまく機能しません。

サブクエリ:

SELECT * FROM `packages` 
WHERE 2 = (
    SELECT count(*) FROM `package_publications` 
    WHERE `packages`.id = `package_publications`.package_id 
     AND `package_publications`.publication_id IN (11, 47) 
) 
0

それらの両方のパブリケーションのIDを持っているパッケージはあなたがフィルターにそれを使用することができ、結果セットに二回表示されますので。あまり効率的ではありませんが、より良い解決策が見つかるまで問題を解決する可能性があります。

SELECT * FROM packages WHERE packages.id IN (
    SELECT package_publications.package_id 
    WHERE package_publications.publication_id IN (11,47) 
    GROUP BY package_publications.package_id 
    HAVING COUNT(package_publications.package_id) = 2 
) 
関連する問題