以下は、私がセットアップした3つのテーブルです。「words」および「word_part_mapping」テーブルは、parts テーブルから部品名に含まれるすべての単語にインデックスを付けることによって、自動的に生成されます。
//'parts' table
+----------+--------------+
| part_num | part_name |
+----------+--------------+
| 10111 | front bumper |
| 10112 | rear bumper |
+----------+--------------+
//'words' table
+------+------------+
| id | word |
+------+------------+
| 1 | front |
| 2 | bumper |
| 3 | rear |
+------+------------+
//'word_part_mapping' association table
+---------+----------+
| word_id | part_num |
+---------+----------+
| 1 | 10111 |
| 2 | 10111 |
| 3 | 10112 |
| 1 | 10112 |
+---------+----------+
ユーザーが「フロント バンパー」を検索し、ユーザーが検索したすべての単語を含む結果をクエリで返したい場合、これをクエリするにはどうすればよいですか?
SELECT p.*
FROM words w
LEFT JOIN word_part_mapping wpm ON w.id=wpm.word_id
LEFT JOIN parts p ON wpm.part_num=p.part_num
WHERE w.word='front' AND w.word='bumper'
明らかに、単語が「front」と「bumper」の両方に等しくないため、上記のクエリは機能しません。これは、OR を実行すると機能しますが、あまりにも多くの結果 (データベース内の 50,000 以上の部品) が返されるため、これは望ましくありません。
==============================================
編集:ついに機能しました...
SELECT p.*
FROM words w
LEFT JOIN word_part_mapping wpm ON w.id=wpm.word_id
LEFT JOIN parts p ON wpm.part_num=p.part_num
WHERE w.word IN('front','bumper')
GROUP BY p.part_num
HAVING COUNT(DISTINCT w.word) = 2
ここで、2 はユーザーが検索している用語の数です