2016-09-26 157 views
0

我有以下查詢:分組多列

SELECT od.product_id, od.product_name, od.product_quantity, od.product_price, 
     o.id_address_delivery, a.id_country, a.id_state, s.name 
FROM `ps_order_detail` od 
LEFT JOIN ps_orders AS o ON od.`id_order` = o.`id_order` 
LEFT JOIN `ps_address` AS a ON o.`id_address_delivery` = a.`id_address` 
LEFT JOIN `ps_state` AS s ON a.id_state = s.id_state 
ORDER BY o.`date_add` DESC 
LIMIT 100; 

凡返回類似以下數據:

PRODUCT_ID | product_name | product_qty | product_price | id_state

我想知道在每個州的最暢銷產品(數量方面)。例如:

狀態A:最好的賣方產品A(500出售的量) 狀態B:最暢銷的是產品C(150出售量) 狀態C:最好的賣方產品A(100出售的量)

目前我正在考慮做2列之間的JOIN,但第二個想到這需要像功能「樞軸」。

我知道如何獲得合計賣出數量爲每種產品

SELECT od.product_id, od.product_name, COUNT(od.product_id) AS 'total' 
FROM `ps_order_detail` od 
GROUP BY od.product_id 
ORDER BY od.product_id DESC 
LIMIT 100; 

我也知道賣量爲每個州總,但我不知道如何既結合才達到我需要什麼。我會很感激任何幫助。謝謝

+0

你的小組將在5.7失敗,'ONLY_FULL_GROUP_BY' – Drew

+0

@Drew,將在所有MySQL版本,如果啓用ONLY_FULL_GROUP_BY :)不同的是,在最新版本的5.7 ONLY_FULL_GROUP_BY是默認啓用的失敗,而在以前的版本不是這樣。儘管product_name可能在功能上依賴於product_id,但即使啓用了ONLY_FULL_GROUP_BY,最新版本的MySQL甚至可能允許查詢。 – Shadow

+0

Right @ Shadow開箱即用。當然它是可配置的。 5.7最終會不願意讓自己在腳下自己拍攝 – Drew

回答

2

您需要聚合查詢的最大分組數。你可以這樣做,例如像這樣:

select state, product_name, quantity 
from (
    select id_state, state, product_id, product_name, quantity, 
    @grprow := (case when @grp = id_state then @grprow + 1 else 1 end) as grprow, 
    @grp := id_state 
    from ( 
    SELECT a.id_state, max(s.name) as state, od.product_id, 
     max(od.product_name) as product_name, 
     sum(od.product_quantity) as quantity 
    FROM `ps_order_detail` od 
    LEFT JOIN ps_orders AS o ON od.`id_order` = o.`id_order` 
    LEFT JOIN `ps_address` AS a ON o.`id_address_delivery` = a.`id_address` 
    LEFT JOIN `ps_state` AS s ON a.id_state = s.id_state 
    group by a.id_state, od.product_id 
) grped, 
    (select @grprow := 0, @grp := null) init 
    order by id_state, quantity desc, product_id 
) grpmax 
where grprow = 1 
order by id_state; 

這將總結每個狀態和產品的數量,則每個狀態的結果數,然後採取的第一個。如果兩種產品在一種狀態下具有相同的數量,則僅採用其中一種(使用較低的product_id)。如果您想同時擁有這兩個號碼,則可以調整@grprow的編號條件。