2011-04-29 424 views
0

我有以下MySQL查詢:如何施加條件,一個「GROUP BY」語句 - MySQL的

SELECT * 
    FROM products 
WHERE catalog = 1 
GROUP BY style 
ORDER BY name ASC 
limit 0, 100 

因爲我有多個產品相同的「風格」,這將返回關於任何的第一信息產品具有某種「樣式」(通過GROUP BY條件)。

因爲有些產品有「打折」,我問題如下我怎麼讓它使「GROUP BY式」條件給出最優先考慮有折扣的產品?我的最終目標是使用1個查詢,而不是經過每個返回的樣式,並檢查是否有任何折扣產品

如果我指定「GROUP BY樣式,折扣」,它會返回2個產品風格:1和1沒有折扣。這不是我需要的東西 - 我只需要返回1個匹配(獨特)風格,但優先考慮那些與此風格相匹配並具有折扣的項目。

+0

您是什麼意思的「偏好」?你只想要有折扣的結果,還是希望他們先按折扣訂購,然後再購買其他結果? – Wes 2011-04-29 17:41:56

+0

@wes:我想要結果有折扣,但如果沒有折扣,我仍然想要得到結果。 – MarkL 2011-04-29 17:43:44

+0

如果給定風格的輸出是[正常,打折]只返回[折扣],但如果它只是[正常]返回[正常]? – 2011-04-29 17:45:00

回答

1

中你不能在一個查詢中設置電郵宣傳強加的優先級。在應用GROUP BY之前,您可以通過使用WHERE來限制結果,但這隻會剝離不滿足WHERE條件的行的結果。要在分組集合中查找訂單,請使用類似這樣的查詢:(假設id是此處的主鍵)

SELECT p.* FROM 
    (SELECT style,max(discount) as highest_discount 
    FROM products 
    WHERE catalog = 1 
    GROUP BY style) p1 
JOIN products p 
ON p.id = 
    (SELECT pu.id 
    FROM products pu 
    WHERE pu.catalog = 1 
     AND pu.style = p1.style 
     AND pu.discount = p1.highest_discount 
    LIMIT 1) 
+0

Piotrm,這工作像一個魅力。但是,我的系統花費了大約6秒(在生產服務器上花了2.7秒)來處理查詢,並且考慮到我將它限制爲0,12。幾乎是相同的,或比運行2個查詢慢。 – MarkL 2011-04-29 18:40:02

+0

它不應該這麼慢,請嘗試EXPLAIN以查看索引是否正確使用。 – piotrm 2011-04-29 18:52:11

+0

http://pastebin.com/Wx9hAJ24 <<「EXPLAIN」ation :) – MarkL 2011-04-29 19:10:27

0

當您說「優先考慮有折扣的產品」時,優先級意味着排序,而不是分組。你需要通過discount(我假設它是一列,而不是表格)來訂購你的結果。

+0

我想要結果給我一個折扣> 0的字段。如果沒有折扣的商品存在,我仍然想要獲得結果。請參閱我不確定「GROUP BY」語句如何選擇具體產品的信息(包含所有具有給定樣式的產品)以顯示。 – MarkL 2011-04-29 17:55:34

0

我認爲這可以用HAVING條款來完成;假設折扣表是布爾值,1折,0表示無折扣:

SELECT * 
FROM 
    products 
WHERE 
    catalog = 1 
GROUP BY 
    style 
HAVING 
    discount = MAX(discount) 
ORDER BY 
    name ASC limit 0, 100 

編輯:我可能誤解了問題。如果你想要的是這些項目至極有折扣,以先出現在列表中,你只需要改變ORDER BY條款:

SELECT * 
FROM 
    products 
WHERE 
    catalog = 1 
GROUP BY 
    style 
ORDER BY 
    discount DESC, 
    name ASC 
LIMIT 
    0, 100 
+0

謝謝但這些查詢都沒有產生想要的結果。上面的piotrm的解決方案完成這項工作。 – MarkL 2011-04-29 18:46:34