2016-09-26 58 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的编号条件。