2013-06-20 29 views
1

例如,存在一個包含商品屬性的表。每個產品可以具有相同屬性的多個值。在MYSQL中使用HAVING提供多個條件的查詢

商品

goods_id | property | value 

1  |color  | red 
1  |size  | 100 
1  |size  | 200 
2  |color  | red 
2  |color  | green 
2  |size  | 200 

如果我需要找到蒙山色紅色和大小的所有的項目,然後我運行此查詢:

SELECT goods_id FROM goods 
WHERE (property = 'color' AND value = 'red') OR 
     (property = 'size' AND value = '100') 
GROUP BY goods_id 
HAVING COUNT(goods_id) = 2 

MYSQL返回goods_id = 1

但是如果我需要找一個顏色的所有項目紅色或綠色和大小的,下面的查詢

SELECT goods_id FROM goods 
WHERE (property = 'color' AND value IN ('red', 'green')) OR 
     (property = 'size' AND value = '100') 
GROUP BY goods_id 
HAVING COUNT(goods_id) = 2 

返回IDS 1和2,但應該只1.
我怎樣才能改變第二查詢返回正確的結果?感謝您的任何意見

+0

你期望的結果是什麼?請發帖。 – Edper

回答

1

更改HAVING條件:

HAVING COUNT(DISTINCT property) = 2 
+0

@Kir:很高興能幫到你。 –

0

這是你的表:

goods_id | property | value 
    1  | color | red 
    1  | size  | 100 
    1  | size  | 200 
    2  | color | red 
    2  | color | green 
    2  | size  | 200 

這是你的第一個查詢:

SELECT goods_id FROM goods 
    WHERE (property = 'color' AND value = 'red') OR 
    (property = 'size' AND value = '100') 
    GROUP BY goods_id 
    HAVING COUNT(goods_id) = 2 

沒有HAVING子句第一,只有WHERE聲明,你將得到結果:

1  | color | red 
    1  | size  | 100 
    2  | color | red 

但與HAVING子句現在因爲只需要goods_id具有計數2,然後剩下的是:

1  | color | red 
    1  | size  | 100 

而且因爲你組它只1仍然因爲你顯示goods_id。現在

,在第二次的查詢您有:

SELECT goods_id FROM goods 
WHERE (property = 'color' AND value IN ('red', 'green')) OR 
    (property = 'size' AND value = '100') 
GROUP BY goods_id 
HAVING COUNT(goods_id) = 2 

基礎上再次的標準沒有你想的colorproperty與價值HAVING條款或者(這意味着OR)red或​​OR的propertysizevalue100。所以,你會得到的結果是:

goods_id | property | value 
    1  | color | red 
    1  | size  | 100 
    2  | color | red 
    2  | color | green 

而且隨着COUNT(goods_id)=2HAVING條款自然的1兩個goods_id2將導致。

換句話說,查詢結果是正確

所以,如果你想只有一個結果,那麼你很可能

LIMIT 1 

或很可能您的查詢是錯誤的,因此,你需要改變它的一部分。

+0

您的解決方案是我所描述的唯一特例。但是,如果id = 2的產品的屬性大小爲100,那麼請求應該返回goods_id 1和2.但無論如何感謝您的查詢分析 – Kir

+0

不客氣@Kir。上帝保佑。 – Edper