0

リンク テーブルからの選択と、余分な結果の除外に問題があります。

パブリケーションは、 package_publicationsテーブルによってパッケージに属します。

たとえば、自分の出版物の ID が 11 と 47 であることを知っています。これらの出版物のみを含むパッケージを返品したいと考えています。

ここで、結合を行い、明らかな内部結合の後に何かを行うと、 package_publicationsリンク テーブルwhere publications.id IN (11, 47)にこれらの値のいずれかを持つすべてのパッケージが返されます。

BOTH (またはそれ以上 - 2 つに限定されません) しかないパッケージを一致させたいと考えています。AND が必要な場合は事実上 OR を使用していますが、SQL でアプローチする方法がわかりません。

4

2 に答える 2

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)
 )
于 2009-07-25T14:37:38.943 に答える
0

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

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
)
于 2009-07-25T14:46:51.503 に答える