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