1

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

当您删除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`)

非常感谢任何建议

4

1 回答 1

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 之前对行进行排序的原因。请记住,这是不正确的并且非常骇人听闻。

于 2012-08-23T12:50:00.640 回答