下面是我设置的 3 个表。'words' 和 'word_part_mapping' 表是通过从部件表中索引部件名称中的所有单词来自动生成的。
//'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 是用户正在搜索的术语数