2012-10-27 97 views
2

如果以前有人問過這個問題,但我真的不知道要搜索什麼,所以不確定如何在問題標題中加上字,以便手指交叉。選擇依賴於表格中其他行的行

我正在構建一個相當普遍的系統,其中一個產品可以有多個類別,在前端,用戶可以搜索指定多個類別的產品。

假設我們有以下的架構和數據(我不能發表圖片呢,道歉,請參閱鏈接) -

表名:product_categories

數據:

enter image description here

產品表非常標準 - 編號,名稱,數量等

所以產品1有2個類別。

如果用戶在搜索頁面上選中代表類別2和3的2個複選框,我將如何查詢,以便只有具有這兩個類別的產品才能返回?

一些諸如如下不起作用,因爲在沒有人行其中有2類別ID和3類別ID:

SELECT * from product_categories where `category_id` = 2 AND `category_id` = 3; 

我已經嘗試使用其中藏漢,但是,即使我正在尋找具有類別id 2和6(例如)的產品,我也不想要這樣的產品。

這是一個更大的查詢的一部分,但是,如果我設法找到一個,我將能夠應用該解決方案。

+0

非常感謝您的建議傢伙,大加讚賞。我認爲找到了一個解決方案,這似乎產生了預期的結果,但我會寫我的方法,以確保它的工作更多的單元測試。 我發現的解決方案如下: SELECT * FROM products_categories其中CATEGORY_ID在(2,3),其具有計數(不同(ID))= 2 所以這使用WHERE IN,然而,當使用具有,則它檢查返回唯一記錄的計數,並確保它等於提供的類別數量。 歡呼聲, Darren * PS:不確定如何指定MySQL語法高亮顯示,道歉* –

回答

0

非常感謝您的建議傢伙, 非常感激。我認爲找到了一個解決方案,這似乎產生了預期的結果,但我會寫我的方法,以確保它的工作更多的單元測試。

我找到了解決辦法如下:

select * from products_categories where category_id in (2,3) HAVING count(distinct(id)) = 2 

所以這個使用WHERE IN,然而,使用具有,它然後檢查的唯一記錄的計數返回,並確保它等於提供的類別的數量。

乾杯, 達倫

0

東西沿着這條道路應該工作

SELECT * FROM products WHERE 
    EXISTS (SELECT * FROM product_categories 
      WHERE product_id = products.id AND category_id = 2) 
    AND 
    EXISTS (SELECT * FROM product_categories 
      WHERE product_id = products.id AND category_id = 3) 
    ... 

其他的解決辦法是產生JOIN每個類別。

SELECT * FROM products 
JOIN product_categories AS cs1 ON cs1.product_id = products.id 
           AND cs1.category_id = 2 
JOIN product_categories AS cs2 ON cs2.product_id = products.id 
           AND cs2.category_id = 3 
... 

除非你希望product_categories要大於幾百萬行,這兩個解決方案應合理工作,如果創建正確的索引。

0

我認爲你需要使用一個子查詢的位置:

SELECT * from product_categories where id IN (SELECT id from product_categories where `category_id` = 2) AND IN (SELECT id from product_categories where `category_id` = 3) 

我不是100%肯定這工作(很長一段時間,因爲我用SQL工作)