2011-01-10 64 views
2

我有三個表,我們將假裝稱爲產品,優惠券和折扣。我有一個試圖拉取產品列表的查詢,並運行一個子查詢來查找有效折扣的任何優惠券。來自子查詢和問題組的MySQL最大值

例如,這說明什麼,我嘗試:

SELECT products.id, products.name, 
(
SELECT MAX(discounts.amount) FROM discounts 
WHERE discounts.coupon_id = coupons.id 
LIMIT 1 
) as discount 
FROM products 
LEFT JOIN coupons ON products.id = coupons.product_id 
GROUP BY products.id 

我的問題是,我GROUP BY是必要的很多其他原因。但是,如果每個產品都有多個優惠券,則在發生分組時,「折扣」會以奇怪的方式結合使用。

假設單件產品有三張優惠券 - 兩張沒有任何折扣,一張打折率爲33%。當出現羣組時,我想選擇最高值,但默認情況下,MySQL將該值返回爲0.

使用MAX是子查詢顯然只返回每個單獨優惠券的折扣的最大值。我只需告訴GROUP BY使用最大值。

我可以很容易地使用GROUP_CONCAT返回所有這些字符串,但我也需要在某些HAVING條件下使用該值進行計算。

有什麼建議嗎?

回答

0

我不認爲你想要或需要子查詢。這會爲你帶來什麼回報?

SELECT products.id, products.name, MAX(discounts.amount) AS discount 
FROM products 
LEFT JOIN coupons ON products.id = coupons.product_id 
LEFT JOIN discounts ON coupons.id = discounts.coupon_id 
GROUP BY products.id 
+0

不幸的是,它並不像這樣容易。我會使用連接,但實際上有四個子查詢 - 每個查詢可能有不同類型的折扣。我似乎不可能以一種不需要每個產品都具有全部四個連接的方式來構建連接。子查詢使這種情況更容易/可能。我想我會玩更多。 – helion3 2011-01-10 20:14:27

0

您僅按productid分組,而子選擇實際上返回三個值(產品的每個優惠券各一個)。我真的希望這個查詢返回一個錯誤。您應該將折扣向上移動一級,或將優惠券移至子選擇。第一個例子(子查詢通常在MySQL中較慢):

select 
    p.productid, 
    max(d.discount) as discount 
from 
    product p 
    left join coupon c on c.productid = p.productid 
    left join discount d on d.couponid = c.couponid 
group by 
    p.productid