Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/visual-studio-code/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 按指定顺序排序,然后按分组_Mysql_Group By_Sql Order By - Fatal编程技术网

Mysql 按指定顺序排序,然后按分组

Mysql 按指定顺序排序,然后按分组,mysql,group-by,sql-order-by,Mysql,Group By,Sql Order By,在按产品id进行分组之前,我将如何按ap\u status以'n',p',d',c',b',x'的顺序对所有行进行排序 当您删除分组依据时,此查询将正确排序 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`*/ OR

在按
产品id进行分组之前,我将如何按
ap\u status
'n',p',d',c',b',x'
的顺序对所有行进行排序

当您删除分组依据时,此查询将正确排序

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
因此,在看了一些类似的问题后,我尝试使用
have
,但是,这在两个小组之前都不起作用

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`)
非常感谢您的建议

您可以尝试:

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中您会得到异常。 如果有两行具有相同的product_id和不同的ap_状态,理论上您无法说出查询应该返回哪一行。我猜您已经知道,在MySQL中,第一行将被返回,这就是为什么您希望在执行GROUPBY之前对行进行排序。请记住,这是不正确的,而且非常粗糙。

您可能需要尝试:

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中您会得到异常。
如果有两行具有相同的product_id和不同的ap_状态,理论上您无法说出查询应该返回哪一行。我猜您已经知道,在MySQL中,第一行将被返回,这就是为什么您希望在执行GROUPBY之前对行进行排序。请记住,这是不正确的,而且非常粗糙。

也许您可以使用ORDER BY查询作为另一个查询的子查询,该查询在其结果上使用GROUP BY。或者使用临时表或其他东西。向我们展示您的查询。无论如何,如果您要分组并应用聚合函数,您不需要OrderBy,也许您可以使用OrderBy查询作为另一个查询的子查询,该查询在其结果上使用GROUPBY。或者使用临时表或其他东西。向我们展示您的查询。无论如何,如果您要分组并应用聚合函数,您不需要完全完成这项工作,但是,
计数(ap\u id)
会由于
group by
位于外部而导致错误,是否也有办法获得此结果?我尝试将其移动到外部
SELECT
上,但也出现了错误,谢谢:)我将
SELECT*、count(ap_id)
ap_id
添加到内部
SELECT
上,这样就不会出错。这可能有点骇人听闻,但如果你不知道,我就不说了@JPickup啊,对了,我的错-我还没有看到计数(ap_状态),我会完美地更新答案。但是,
count(ap_id)
由于
组成员在外部而导致错误,是否也有办法获得此结果?我尝试将其移动到外部
SELECT
上,但也出现了错误,谢谢:)我将
SELECT*、count(ap_id)
ap_id
添加到内部
SELECT
上,这样就不会出错。这可能有点骇人听闻,但如果你不知道,我就不说了@JPickup啊对,我的坏-我还没有看到计数(ap_状态),我会更新答案