我有以下查询:
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个销售数量)
目前我正在考虑在两列之间进行联接,但第二次认为这需要一个类似“枢轴”的功能。
我知道如何获得每种产品的总销售数量
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 :(得分:2)
您需要聚合查询的groupwise最大值。你可以这样做,例如像这样:
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
的编号条件。