【问题标题】:Grouping Multiple Columns对多列进行分组
【发布时间】:2016-09-27 05:23:22
【问题描述】:

我有以下疑问:

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 |产品名称 |产品数量 |产品价格 | 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;

我也知道每个州的总销售量,但我不确定如何将两者结合起来以达到我的需要。我会很感激任何帮助。谢谢

【问题讨论】:

  • 您的 group by 将在 5.7 中失败,ONLY_FULL_GROUP_BY
  • @Drew 如果启用了 ONLY_FULL_GROUP_BY,它将在所有 MySQL 版本中失败 :) 不同之处在于,在最近的 5.7 版本中,默认情况下启用了 ONLY_FULL_GROUP_BY,而在以前的版本中则没有。虽然 product_name 可能在功能上依赖于 product_id,所以即使启用了 ONLY_FULL_GROUP_BY,最新版本的 MySQL 甚至可能允许查询。
  • 正确的@Shadow 开箱即用。当然它是可配置的。 5.7 毕竟不愿意让一个人朝自己的脚开枪
  • 不,MySQL 只是不希望每个从 Teach Yourself PHP in 24 Hours 中学习 php / MySQL 的人的代码在迁移后崩溃:)
  • 是的,我正在使用 mysql 5.7,实现这一目标的最佳方法是什么?或者这是应该在代码中完成的事情吗?

标签: mysql prestashop prestashop-1.5


【解决方案1】:

您需要聚合查询的分组最大值。你可以这样做,例如像这样:

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 的编号条件。

【讨论】:

    猜你喜欢
    • 2015-05-17
    • 1970-01-01
    • 1970-01-01
    • 2012-09-10
    • 2020-08-10
    • 1970-01-01
    • 1970-01-01
    • 2018-03-01
    相关资源
    最近更新 更多