製品に関連するデータベースに 3 つのテーブルがあります。
tbl_item -- basic item table
---------
item_id | item_name
tbl_item_term -- descriptive terms
--------------
term_id | term_name
tbl_item_term_map -- assigns terms to items
-----------------
item_id | term_id
以前の質問のおかげで、2 つのクエリを実行することで、特定のアイテムに関連するすべてのアイテムを用語で選択できます。
アイテムの用語を収集するためのもの (この例では item_id 2736):
SELECT
tt.term_id
FROM tbl_item ti
INNER JOIN tbl_item_term_map ttm
on ttm.item_id = ti.item_id
INNER JOIN tbl_item_term tt
on tt.term_id = ttm.term_id
WHERE ti.item_id = 2736
次に、結果を解析して配列に入れるため、PHP コードを少し実行すると、次のようになります。
$array = (1,7,12,20)
次に、この配列を取得して、次のように Web サイトにプラグインします。
SELECT DISTINCT
item_name
FROM tbl_item ti
INNER JOIN tbl_item_term_map ttm
on ttm.item_id = ti.item_id
INNER JOIN tbl_item_term tt
on tt.term_id = ttm.term_id
WHERE tt.term_id IN($array)
の条件ですべての関連アイテムを返します1,7,12,20
。
私が今望んでいるのは、共通の用語が複数あるアイテムを返すことです。例えば、
related item1 has terms 1,2,3
related item2 has terms 1,7,9
related item3 has terms 7,8,9
理想的には、私の新しいクエリは item2 だけを返します。なぜなら、用語 1 と 7 が共通しているためです。何か案は?
クリス
編集
別の言い方をすれば、次のクエリがあるとします。
SELECT ti.item_id
FROM tbl_item ti
JOIN tbl_item_term_map ttm on ttm.item_id = ti.item_id
JOIN tbl_item_term tt on tt.term_id = ttm.term_id
WHERE tt.term_id = 1
UNION
SELECT ti.item_id
FROM tbl_item ti
JOIN tbl_item_term_map ttm on ttm.item_id = ti.item_id
JOIN tbl_item_term tt on tt.term_id = ttm.term_id
WHERE tt.term_id = 7
最初のクエリは単独で 100 件の結果を提供し、2 番目のクエリは 50 件の結果を提供しますUNION
。抽出しようとしているのは、30 個の重複 ID が欠落していることです。2 つのクエリから重複を取得するにはどうすればよいですか?