我的表格由两列组成:
id | my_group
-------------
1 | 3
2 | 2
3 | 1
4 | no_group
5 | 3
6 | 1
7 | 2
8 | 3
9 | no_group
10 | 1
您能否使用 MySQL 帮助我获得下面显示的正确排序顺序?
id | my_group
-------------
10 | 1
6 | 1
3 | 1
9 | no_group
8 | 3
5 | 3
1 | 3
7 | 2
2 | 2
4 | no_group
my_group
列按降序排序,但如果 my_group
不等于“no_group”,my_group
应首先对结果进行分组。
最佳答案
您可以通过以下语句获得这个复杂的订单:
SELECT
e.id,
e.my_group
FROM
example e
LEFT JOIN (
SELECT
MAX(e1.id) maxid,
e1.my_group
FROM
example e1
WHERE
e1.my_group <> 'no_group'
GROUP BY e1.my_group
) t
ON
e.my_group = t.my_group
ORDER BY COALESCE(t.maxid, id) DESC, id DESC;
说明:
我们使用子查询进行左连接,返回每个组的最大 id(如果存在组)。
结果
SELECT
e.id,
e.my_group,
t.maxid,
COALESCE(t.maxid, e.id)
FROM
example e
LEFT JOIN (
SELECT
MAX(e1.id) maxid,
e1.my_group
FROM
example e1
WHERE
e1.my_group <> 'no_group'
GROUP BY e1.my_group
) t
ON
e.my_group = t.my_group
是
id my_group maxid COALESCE(t.maxid, e.id)
10 1 10 10
6 1 10 10
3 1 10 10
9 no_group NULL 9
5 3 8 8
1 3 8 8
8 3 8 8
2 2 7 7
7 2 7 7
4 no_group NULL 4
因此,对于具有“no_group”的行,我们在 maxid
列中得到 NULL。对于这些行,我们必须获取 id。 COALESCE返回其参数的第一个非空值,因此它返回每个组的最大 id 以及带有“no_group”的行的 id 值。
注意:
如果存在 NULL
值而不是字符串“no_group”,那么您可以简单地省略子选择的 WHERE
子句。我更喜欢这个。
关于mysql - 使用 MySQL 根据字段值进行排序和分组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25470484/