更有效,考慮以下因素:
DROP TABLE IF EXISTS my_table;
CREATE TABLE my_table
(ID INT NOT NULL AUTO_INCREMENT PRIMARY KEY
,NAME VARCHAR(12) NOT NULL
,SURNAME VARCHAR(12) NOT NULL
,EXTRA VARCHAR(12) NOT NULL
,TYPE INT NOT NULL
);
INSERT INTO my_table VALUES
(1,'MARIO','ROSSI','RED','10'),
(2,'MARCO','VERDI','YELLOW','10'),
(3,'GIANNI','BLU','TEACHER','20'),
(4,'LUCA','BLU','STUDENT','20'),
(5,'LUCA','ROSSI','GREEN','10'),
(6,'MARIA','GIALLA','2005/08/10','30'),
(7,'MARTA','ROSA','1979/01/11','30'),
(8,'FRANCO','NERO','BARMAN','20'),
(9,'MARY','NERI','1988/09/05','30'),
(10,'MAX','BLU','1998/08/06','30'),
(11,'MARIO','ROSSI','PLUMBER','20'),
(12,'MARCO','VERDI','TAILOR','20'),
(13,'GIANNI','BLU','YELLOW','10'),
(14,'LUCA','BLU','BLUE','10'),
(15,'LUCA','ROSSI','BAKER','20'),
(16,'MARIO','ROSSI','2004/08/10','30'),
(17,'MARCO','VERDI','1978/01/11','30'),
(18,'FRANCO','NERO','RED','10'),
(19,'FRANCO','NERO','1987/09/05','30'),
(20,'MARIA','GIALLA','1995/08/06','30');
SELECT name
, surname
, MAX(CASE WHEN type = 10 THEN extra END) colour
, MAX(CASE WHEN type = 20 THEN extra END) occupation
, MAX(CASE WHEN type = 30 THEN extra END) date
FROM my_table
GROUP
BY name
, surname
ORDER
BY name
, surname
, extra
, type
, date DESC;
+--------+---------+--------+------------+------------+
| name | surname | colour | occupation | date |
+--------+---------+--------+------------+------------+
| FRANCO | NERO | RED | BARMAN | 1987/09/05 |
| GIANNI | BLU | YELLOW | TEACHER | NULL |
| LUCA | BLU | BLUE | STUDENT | NULL |
| LUCA | ROSSI | GREEN | BAKER | NULL |
| MARCO | VERDI | YELLOW | TAILOR | 1978/01/11 |
| MARIA | GIALLA | NULL | NULL | 2005/08/10 |
| MARIO | ROSSI | RED | PLUMBER | 2004/08/10 |
| MARTA | ROSA | NULL | NULL | 1979/01/11 |
| MARY | NERI | NULL | NULL | 1988/09/05 |
| MAX | BLU | NULL | NULL | 1998/08/06 |
+--------+---------+--------+------------+------------+
你可以加入這樣的結果(或實際上是一個更簡單的選擇 - 但我會用這根棍子現在)返回到原來的表格根據需要訂購結果。我已經添加了STR_TO_DATE函數,僅供參考。顯然這裏沒有必要,而且與你的版本需要的方式稍有不同...
SELECT x.*
, y.date
FROM my_table x
LEFT
JOIN
(SELECT name
, surname
, MAX(CASE WHEN type = 30 THEN extra END) date
FROM my_table
GROUP
BY name
, surname
) y
ON y.name = x.name
AND y.surname = x.surname
ORDER
BY x.name
, x.surname
, STR_TO_DATE(y.date,'%Y/%m/%d') DESC;
+----+--------+---------+------------+------+------------+
| ID | NAME | SURNAME | EXTRA | TYPE | date |
+----+--------+---------+------------+------+------------+
| 18 | FRANCO | NERO | RED | 10 | 1987/09/05 |
| 19 | FRANCO | NERO | 1987/09/05 | 30 | 1987/09/05 |
| 8 | FRANCO | NERO | BARMAN | 20 | 1987/09/05 |
| 13 | GIANNI | BLU | YELLOW | 10 | NULL |
| 3 | GIANNI | BLU | TEACHER | 20 | NULL |
| 14 | LUCA | BLU | BLUE | 10 | NULL |
| 4 | LUCA | BLU | STUDENT | 20 | NULL |
| 15 | LUCA | ROSSI | BAKER | 20 | NULL |
| 5 | LUCA | ROSSI | GREEN | 10 | NULL |
| 17 | MARCO | VERDI | 1978/01/11 | 30 | 1978/01/11 |
| 2 | MARCO | VERDI | YELLOW | 10 | 1978/01/11 |
| 12 | MARCO | VERDI | TAILOR | 20 | 1978/01/11 |
| 6 | MARIA | GIALLA | 2005/08/10 | 30 | 2005/08/10 |
| 20 | MARIA | GIALLA | 1995/08/06 | 30 | 2005/08/10 |
| 11 | MARIO | ROSSI | PLUMBER | 20 | 2004/08/10 |
| 16 | MARIO | ROSSI | 2004/08/10 | 30 | 2004/08/10 |
| 1 | MARIO | ROSSI | RED | 10 | 2004/08/10 |
| 7 | MARTA | ROSA | 1979/01/11 | 30 | 1979/01/11 |
| 9 | MARY | NERI | 1988/09/05 | 30 | 1988/09/05 |
| 10 | MAX | BLU | 1998/08/06 | 30 | 1998/08/06 |
+----+--------+---------+------------+------+------------+
你介意分享你得到的確切錯誤嗎? – Olli
另外,我不明白所需的結果集是如何符合要求的。你是否希望日期(即30型)的結果以日期降序存儲?如果是這樣,考慮將日期存儲爲恰當的日期數據類型(即yyyy/mm/dd) – Strawberry
當名稱和姓氏的所有組合都是唯一的時候,按日期排序是相當不合理的。 – Strawberry