the question has been posted but marked as duplicate. Please note
that I am aware of simple ORDER BY with multiple columns and with a
window function MIN() for example for a simple case of
two columns.
Suppose I have a table so-called Contact (Table 1.) What I want to
achieve is to sort first by Status than within the result, sort
Client by CalledAt (keep Client close together by CreatedAt
while keeping the order of Client as-is from the first sort)
Bellow my explanation, please suggest a better question/explanation if it makes things clearer.
Thank you,
Step 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 |
Step 1: Sort by Status
| 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 |
Now the list of clients are: YXXYXZ, I want to keep the client Y
first, because it appeared first in the list then X because it appeared first after all the Y then Z...
The list of clients should be YYXXXZ. Within the client, they should be sorted by CreatedAt.
Step 2: Line 1 is moved above line 2 becase it shares the same client Y
but with a smaller (sonner) CalledAt. Line 5 is moved above line 3 and
line 4 is move bellow line 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 |
CodePudding user response:
In MySQL 5.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
