【问题标题】:ORDER BY specified order before GROUP BYORDER BY 在 GROUP BY 之前指定顺序
【发布时间】:2012-08-23 12:37:15
【问题描述】:

在按product_id 分组之前,如何按'n', 'p', 'd', 'c', 'b', 'x' 的顺序按ap_status 对所有行进行排序?

当您删除 GROUP BY 时,此查询的顺序正确

SELECT `account_id`, `product_id`, `product_name`, `ap_status`, count(`ap_id`) as `num` 
FROM (accounts_products_view)
WHERE `account_id` = 13
/*GROUP BY `product_id`*/
ORDER BY FIELD(`ap_status`, 'n', 'p', 'd', 'c', 'b', 'x') desc

所以我在查看了一些类似的问题后尝试使用HAVING,但这在小组之前也不起作用

SELECT account_id, product_id, product_name, ap_status, count(ap_id) as num,
CASE
WHEN ap_status = 'n' then 1
WHEN ap_status = 'p' then 2
WHEN ap_status = 'd' then 3
WHEN ap_status = 'c' then 4
WHEN ap_status = 'b' then 5
WHEN ap_status = 'x' then 6
END as `order`

FROM (accounts_products_view)
WHERE `account_id` = 13
GROUP BY product_id
HAVING `order` = MIN(`order`)

非常感谢任何建议

【问题讨论】:

  • 也许您可以将您的 ORDER BY 查询用作另一个查询的子查询,该查询在其结果上使用 GROUP BY。或使用临时表或某事。
  • 向我们展示您的查询。无论如何,如果您要分组并应用聚合函数,则不需要顺序

标签: mysql group-by sql-order-by


【解决方案1】:

你可能想试试:

SELECT *, count(`ap_id`) as `num` FROM (
        SELECT `account_id`, `product_id`, `product_name`, `ap_status`, `ap_id`
        FROM (accounts_products_view)
        WHERE `account_id` = 13
        /*GROUP BY `product_id`*/
        ORDER BY FIELD(`ap_status`, 'n', 'p', 'd', 'c', 'b', 'x') desc
    ) as res GROUP BY product_id

但请记住,这是不正确的!如果您使用 group by,那么您需要使用聚合函数,例如 SUM(),或者也指定 group by 中的字段。在您的示例中,您可能正确检索的字段是 product_id ,仅此而已。由于 MySQL 错误或其他原因,您不会在此查询中遇到异常,但在 postgresql 中您会遇到异常。 如果您有 2 行具有相同的 product_id 和不同的 ap_status,理论上您无法说出查询应该返回哪一行。我猜您已经知道在 MySQL 中将返回第一行,这就是为什么您要在执行 group by 之前对行进行排序的原因。请记住,这是不正确的,而且非常骇人听闻。

【讨论】:

  • 这项工作完美无缺,但是,count(ap_id) 由于group by 在外面而导致错误,有没有办法得到这个呢?我尝试将它移动到外部 SELECT 但这也出错了谢谢 :)
  • 我将SELECT *,count(ap_id)ap_id 添加到内部SELECT 中,这样可以正常工作。这可能是骇人听闻的,但我不会告诉你是否不这样做!
  • @JPickup 啊对,我的错-我没看到count(ap_status),我会更新答案
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-27
  • 2016-04-03
  • 2021-03-03
  • 2021-11-03
  • 2019-09-02
相关资源
最近更新 更多