我的表格由两列组成:
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
应首先对结果进行分组。
答案 0 :(得分:1)
您可以通过以下声明获得这个复杂的顺序:
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;
<强>解释强>
我们使用subselect进行左连接,如果有组,则返回每组的最大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返回其参数的第一个非null值,因此它返回每个组的最大id和带有'no_group'的行的id值。
注意:强>
如果有NULL
个值而不是字符串'no_group',那么您可以简单地省略subselect的WHERE
子句。我更喜欢这个。