2011-04-01 27 views
3

我已經使用聯結表將「equip」表中的項目鏈接到equipcat表。問題是,我想獲得用戶提供的搜索項的所有項目列表,其中包含equipcat(又名類別描述)字段。但我希望每個項目只列出一次。多個類別中的項目顯示多次

看來我必須對SQL有一些基本的誤解,因爲我以前遇到過這個問題,並且很難搞清楚它。我不僅希望解決這個特殊問題,而且爲了將來的需要也更好地理解它。

這是我的SQL。由於我意識到它們不能縮放/表現良好,請忽略模糊搜索。我也意識到,我使用單個字段來保存關鍵字違反了良好的設計,我只是要求你忽略,除非你認爲這對我所問的問題很重要。

SELECT equip.equipid, equip.equipdesc, equip.equipgeneraldesc, 
    equip.keywords, equip.dayprice, equip.weekprice, 
    equip.monthprice, equip.hideyn, equipcat.equipcat, 
    equipcat.equipcatkeywords 
FROM (equip INNER JOIN equip_equipcat ON equip.equipid = equip_equipcat.equipid) 
INNER JOIN equipcat ON equip_equipcat.equipcatid = equipcat.equipcatid 
WHERE (equip.equipdesc LIKE '%rake%' OR equip.keywords LIKE '%rake%' OR 
    equipcat.equipcat LIKE '%rake%' OR equipcat.equipcatkeywords LIKE '%rake%') 
    AND (equip.hideyn = 0) 
ORDER BY equipdesc ASC; 

回答

1
SELECT equip.* 
FROM equip e 
WHERE equipid IN 
     (
     SELECT equipid 
     FROM equip_equipcat ec 
     JOIN equipcat c 
     ON  c.equipcatid = ee.equipcatid 
     WHERE equipcat LIKE '%rake%' 
       OR 
       equipcatkeywords LIKE '%rake%' 
     ) 
     AND 
     (
     equipdesc LIKE '%rake%' 
     OR 
     keywords LIKE '%rake%' 
     ) 
     AND hideyn = 0 
ORDER BY 
     equipdesc 
+0

爲了使您的建議工作,我必須將equip。*更改爲*和ee.equipcatid更改爲ec.eq​​uipcatid。另外,我相信,第一個AND應該是OR。我試圖返回可能只包含「rake」的記錄。 – HK1 2011-04-01 14:57:56

+0

實際上,經過進一步的測試,我認爲我需要保留原始的AND條件,因爲當我將其更改爲OR時,確實會得到錯誤的結果。 – HK1 2011-04-01 15:03:02

0

A)你包括的字段從表equipcat到你的結果,因此需要一條線爲每個類別反正=>從查詢移除這些列

B)然後,可以添加一個將不同的關鍵字添加到您的查詢中(即SELECT DISTINCT ...),並將多行刪除到不同的行。

+0

霍華德,我不確定我是否理解A.當你說「equiptab」時,你指的是哪張桌子? – HK1 2011-04-01 14:35:25

+0

@ HK1對不起,這是一個錯字。編輯我的答案。我的意思是equipcat.equipcat,equipcat.equipcat。 – Howard 2011-04-01 14:40:13

+0

霍華德,你的回答恰好對我所需要的查詢是正確的,但它確實假設我沒有在演示文稿中使用equipcat表的字段。 – HK1 2011-04-01 15:00:33