2012-04-08 75 views
0

我無法在MySQL運行多參數的搜索查詢:MYSQL多參數搜索

SELECT item.* from item, attr, attr_xref 
    WHERE attr_xref.item = item.id 
    AND attr.id = attr_xref.attrID 
    AND (
     (attr.name = 'city' AND attr.val LIKE '%new york%') 
     OR 
     (attr.name = 'floor' AND attr.val = 6) 
    ) 

查詢與PHP動態生成的,沒有煩惱那裏。

問題是雖然這個查詢不會返回一個嚴格的搜索。它將返回具有等於其搜索值的城市或樓層的物品。

,我可以看到它的問題是在這裏AND attr.id = attr_xref.attrID這行有超過1個屬性項,去掉OR操作我會嘗試匹配與幾個不同的名字和值的單一屬性返回多個值,但只有一個ID。

有什麼辦法可以解決這個問題嗎?

這是一個原始示例,在運行時我可能有超過2,3個搜索參數。

謝謝你,望着你的幫助!

編輯: 得到它通過張貼在接受的答案SQL查詢工作,而只是增加了這一點:

AND (a_city.id IS NOT NULL 
OR a_floor.id IS NOT NULL) 
GROUP BY imobil.id 
HAVING COUNT(*) = 2 

你要組你的結果再算上他們,「= 2 '表示有多少個參數已被傳遞,這將以PHP計算。感謝或你的幫助。 如果有問題你可能會想讀這個question

回答

1

添加兩個左聯接,將創建一個列有「落地」的attr.val,另一個的「城市」的attr.val和檢查至少一個不是null。

事情是這樣的:

SELECT 
    item.* 
FROM 
    item 
JOIN 
    attr_xref ON attr_xref.item = item.id 
LEFT JOIN 
    attr a_city ON a_city.id = attr_xref.attrID 
       AND a_city.name = 'city' 
       AND a_city.val LIKE '%new york%' 
LEFT JOIN 
    attr a_floor ON a_floor.id = attr_xref.attrID 
       AND a_floor.name = 'floor' 
       AND a_floor.val = 6 
WHERE 
    a_city.id IS NOT NULL 
    OR a_floor.id IS NOT NULL 

我沒有測試它,但有些做法類似,這可能爲你工作。

+0

不幸的是,它仍然顯示至少具有其中一個屬性的項目,而不是兩個項目。 – michaeltintiuc 2012-04-08 17:24:29

+0

雖然,如果我將a_city.id和a_floor添加到SELECT,我可以看到這些值爲NULL,但由於某些原因,WHERE不對其進行過濾。 – michaeltintiuc 2012-04-08 17:30:23

+0

謝謝,得到它的工作,只需在最後加上: AND(a_city.id不爲空 或a_floor.id不爲空) group by item.id having count(*)> 1 – michaeltintiuc 2012-04-08 18:07:38