2012-02-18 89 views
2

真的希望有人能幫助我,或者至少讓我指向正確的方向。我在一個產品網站上工作,允許訪問者使用產品結果側面的菜單過濾他們的結果,類似於www.asos.com所做的。基本上,他們可以選擇產品類型,款式,價格,適合等等。這些適配器類型中的每一個都有自己的表格和將每個值鏈接到產品表格的參考表格。 EG沒有與的ProductKey和所有其他產品信息 顏色表表格中同一字段上的多個查詢

產品表,具有以下字段,colour_id採用,名稱 Colourref表的ProductKey,colour_id採用

我使用MySQL和PHP。我知道如何查詢數據庫並顯示數據,如果訪問者從每個過濾器類型進行一次選擇,然後顯示每個屬性的計數,但我真的希望能夠讓他們做出多個選擇,然後計算根據所選內容計算每個屬性的計數。我已經研究過這應該如何完成,我已經看到子查詢是一個選項,但我擔心需要創建多少個子查詢,因爲我有9個過濾器組,可以有大量的子查詢值。目前,數據庫中有一百五十萬個產品,並且隨着時間的推移而增長。我捕獲需要通過URL要查詢的值,因此作爲一個例子

頁= 1個&視圖= 20 &產物= 125137147 &類型= 1,3,5 &顏色= 3,9,5 & material = 187,345

正如您從示例中所看到的,每次都可以有多個值。我試着用AND編寫查詢。例如,產品= 125 AND產品= 137,但這不起作用。

有沒有人有任何建議,最好的方式去做這件事,即使它只是一個正確的方向點?

任何幫助,將不勝感激

預先感謝您

費雯麗

回答

2

基本上你已經回答了自己的問題:

SELECT ... 
FROM ... 
WHERE (product = 125 OR product = 137) AND 
     (colour = 3 OR colour = 8 OR colour = 5) ... 

您需要使用OR代替AND如果你想選擇幾種產品,顏色等。 如果你想要一個產品和顏色,那麼你需要結合使用AND之間。這裏不需要子查詢。


它更容易使用IN雖然:

SELECT ... 
FROM ... 
WHERE product IN (125, 137, 147) AND colour IN (3, 5, 8) 

的這個SQL代碼的一個更完整的例子:

SELECT p.* 
FROM Products p 

LEFT JOIN Colourref cr 
ON cr.productkey = p.productkey 

LEFT JOIN Colours c 
ON c.Colour_ID = cr.Colour_ID 

WHERE 
    p.productkey IN (1, 2, 4) 
    AND c.Colour_ID IN (1, 2) 

這將選擇具有該ID的所有產品1 ,2或4,其顏色爲1或2.

它將ID連接到所需的表格,然後過濾所需的值。

+0

嗨基督,剛剛意識到我已經知道答案,並且即將刪除我的問題。我正在考慮使用AND's,而不是IN。非常感謝你的幫助。 – Amara 2012-02-18 18:11:41

+0

我還有一個問題,如果你不介意的話。我注意到,當我在查詢中使用IN時,MySQL不使用我在列上設置的索引。這是否會使這些索引變得冗餘,我應該刪除它們嗎?再次感謝 – Amara 2012-02-18 18:14:27

+0

@ user1147635如果優化器決定不使用任何索引,那麼通常是因爲全表掃描速度更快。所有的ID列都有索引嗎?請在桌上運行一個'ANALYZE TABLE

'並重試。你怎麼知道它不使用索引?但是,不要在任何情況下刪除它們。它們可能對其他查詢仍然有用。 – Chris2012-02-18 18:26:56

相關問題