0

質問のタイトルについて申し訳ありませんが、この問題の言い方がわかりませんでした。

次のようなテーブルがあります。

entry_id | cat_id
---------+-------
1        | 23
1        | 17
1        | 34
1        | 11
2        | 25
2        | 28
2        | 90
2        | 23

次に、カテゴリごとに異なる配列があります

$cats1 = [23, 46, 67]
$cats2 = [34, 28, 91]

両方の配列に がある をentry_id戻す必要がありますが、そうするとcat_id

->where_in('cat_id', $cats1)->where_in('cat_id', $cats2)

行に複数の行がcat_id関連付けられていないため、明らかにこれは機能しません。この場合、最初の の値と2 番目の の値が含まれているため、entry_id返してほしいのは です。1array(23)array(34)

or_where結果が正確でないため、使用できません。ストレートな SQL 選択ステートメントを使用しても問題ありませんが、このようなテーブルでこのタイプのクエリを実行する方法があるかどうか疑問に思っています。私は SQL の専門家ではないので、アドバイスをいただければ幸いです。

私は現在entry_id、最初の からを取得し、where_in別のクエリでwhere_inそれらidwhere_in2 番目の猫の配列を実行する別のソリューションを使用して動作させていますが、クエリ全体を一度に実行することをお勧めします。

これはPHPにあります。

4

1 に答える 1

1

(更新、修正:)DISTINCTが必要です:

SELECT DISTINCT a.entry_id 
FROM tableX AS a
  JOIN tableX AS b
    ON b.entry_id = a.entry_id 
WHERE a.cat_id IN (23, 46, 67)
  AND b.cat_id IN (34, 28, 91) ;

entryテーブルがある場合は、次のいずれかを使用することもできますJOIN

SELECT DISTINCT e.entry_id 
FROM entry AS e
  JOIN tableX AS a
    ON a.entry_id = e.entry_id 
  JOIN tableX AS b
    ON b.entry_id = e.entry_id 
WHERE a.cat_id IN (23, 46, 67)
  AND b.cat_id IN (34, 28, 91) ;

またはEXISTS相関サブクエリ:

SELECT e.entry_id 
FROM entry AS e
WHERE EXISTS 
      ( SELECT *
        FROM tableX AS a
        WHERE a.entry_id = e.entry_id 
          AND a.cat_id IN (23, 46, 67)
      )
  AND EXISTS 
      ( SELECT *
        FROM tableX AS b
        WHERE b.entry_id = e.entry_id 
          AND b.cat_id IN (34, 28, 91)
      ) ;
于 2012-07-07T13:27:11.103 に答える