MySQL 根据特定规则按多列排序 (3)
MySQL Sort by multiple columns (3) with some specific rules
问题已发布但被标记为重复。请注意
我知道简单的 ORDER BY
有多个列和一个
window 函数 MIN()
例如对于一个简单的例子
两列。
假设我有一个table所谓的Contact
(Table1.)我想要什么
实现是先按 Status
排序,然后在结果中排序
Client
通过 CalledAt
(通过 CreatedAt
使 Client
靠在一起
同时保持 Client
从第一个排序开始的顺序)
下面是我的解释,请提出更好的建议question/explanation
它使事情更清楚。
谢谢,
第 0 步:
ID
User
Client
CalledAt
Status
1
B
Y
2022-02-07
Do not answer
2
A
Y
2022-02-09
Answer
3
A
X
2022-02-08
Answer
4
B
X
2022-02-10
Do not answer
5
A
X
2022-02-06
Answer
6
B
Z
2022-02-11
Do not answer
第 1 步:按状态排序
ID
User
Client
CalledAt
Status
2
A
Y
2022-02-09
Answer
3
A
X
2022-02-08
Answer
5
A
X
2022-02-06
Answer
1
B
Y
2022-02-07
Do not answer
4
B
X
2022-02-10
Do not answer
6
B
Z
2022-02-11
Do not answer
现在客户名单是:YXXYXZ
,我想保留客户Y
首先,因为它首先出现在列表中,然后 X
因为它首先出现在所有 Y
之后,然后 Z
...
客户列表应该是YYXXXZ
。在客户端中,它们应该按 CreatedAt
.
排序
第 2 步:第 1 行移动到第 2 行上方,因为它共享同一个客户端 Y
但是有一个较小的(sonner)CalledAt
。第 5 行移动到第 3 行上方,并且
第 4 行移动到第 3 行下方
ID
User
Client
CalledAt
Status
1
B
Y
2022-02-07
Do not answer
2
A
Y
2022-02-09
Answer
5
A
X
2022-02-06
Answer
3
A
X
2022-02-08
Answer
4
B
X
2022-02-10
Do not answer
6
B
Z
2022-02-11
Do not answer
在MySQL5.x
SELECT
yourTable.*
FROM
yourTable
INNER JOIN
(
SELECT
client,
MIN(id) AS min_id,
MIN(Status) AS min_status
FROM
yourTable
GROUP BY
client
)
AS client
ON client.client = yourTable.client
ORDER BY
client.min_status,
client.min_id,
yourTable.calledAt
问题已发布但被标记为重复。请注意
我知道简单的 ORDER BY
有多个列和一个
window 函数 MIN()
例如对于一个简单的例子
两列。
假设我有一个table所谓的Contact
(Table1.)我想要什么
实现是先按 Status
排序,然后在结果中排序
Client
通过 CalledAt
(通过 CreatedAt
使 Client
靠在一起
同时保持 Client
从第一个排序开始的顺序)
下面是我的解释,请提出更好的建议question/explanation 它使事情更清楚。
谢谢,
第 0 步:
ID | User | Client | CalledAt | Status |
---|---|---|---|---|
1 | B | Y | 2022-02-07 | Do not answer |
2 | A | Y | 2022-02-09 | Answer |
3 | A | X | 2022-02-08 | Answer |
4 | B | X | 2022-02-10 | Do not answer |
5 | A | X | 2022-02-06 | Answer |
6 | B | Z | 2022-02-11 | Do not answer |
第 1 步:按状态排序
ID | User | Client | CalledAt | Status |
---|---|---|---|---|
2 | A | Y | 2022-02-09 | Answer |
3 | A | X | 2022-02-08 | Answer |
5 | A | X | 2022-02-06 | Answer |
1 | B | Y | 2022-02-07 | Do not answer |
4 | B | X | 2022-02-10 | Do not answer |
6 | B | Z | 2022-02-11 | Do not answer |
现在客户名单是:YXXYXZ
,我想保留客户Y
首先,因为它首先出现在列表中,然后 X
因为它首先出现在所有 Y
之后,然后 Z
...
客户列表应该是YYXXXZ
。在客户端中,它们应该按 CreatedAt
.
第 2 步:第 1 行移动到第 2 行上方,因为它共享同一个客户端 Y
但是有一个较小的(sonner)CalledAt
。第 5 行移动到第 3 行上方,并且
第 4 行移动到第 3 行下方
ID | User | Client | CalledAt | Status |
---|---|---|---|---|
1 | B | Y | 2022-02-07 | Do not answer |
2 | A | Y | 2022-02-09 | Answer |
5 | A | X | 2022-02-06 | Answer |
3 | A | X | 2022-02-08 | Answer |
4 | B | X | 2022-02-10 | Do not answer |
6 | B | Z | 2022-02-11 | Do not answer |
在MySQL5.x
SELECT
yourTable.*
FROM
yourTable
INNER JOIN
(
SELECT
client,
MIN(id) AS min_id,
MIN(Status) AS min_status
FROM
yourTable
GROUP BY
client
)
AS client
ON client.client = yourTable.client
ORDER BY
client.min_status,
client.min_id,
yourTable.calledAt