2013-05-09 98 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

相關問題