2013-05-09 84 views
0

下面是我设置的3张桌子。 '词'和'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' 

显然,上述查询不工作,因为这个词不能等于两个“正面”和“丰收”。这可以工作,如果我做或,但我不想这样做,因为它返回太多的结果(数据库中的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项数用户搜索

+0

考虑到答案张贴到你的问题,以便其他人可以受益 – peterm 2013-05-09 07:03:52

回答

0

得到它的工作终于...

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为用户搜索项数

0

怎么样只是希望在part_name这样

SELECT * 
    FROM parts 
WHERE part_name LIKE '%front%' 
    AND part_name LIKE '%bumper%' 

SQLFiddle

+0

peterm :您的解决方案是我过去使用的方法,但我试图避免在part_name字段中使用通配符搜索,因为它返回太多的误报。对于每个零件名称/描述中包含超过100个字的50,000个以上项目的数据库,它也很慢(4-5秒查询时间)。 – 2013-05-09 07:12:10

相关问题