Heim > Fragen und Antworten > Hauptteil
Wie füge ich Zeilen zusammen/kombiniere sie, indem ich den neuestenNicht-Null-Wert jeder Spalte im gruppierten Ergebnis auswähle?
id | Benutzer | Früchte | Zahlen | Erstellungszeit |
---|---|---|---|---|
1 | Jane | Apfel | leer | 2022-01-01 |
2 | John | Wassermelone | 32 | 2022-01-02 |
3 | John | leer | 72 | 03.01.2022 |
4 | John | Birne | leer | 04.01.2022 |
Die folgenden Methoden funktionieren nicht:
SELECT user, COALESCE(fruit) as fruit, COALESCE(number) as number, FROM mytable GROUP BY user ORDER BY created_at DESC
Ich hoffe, das Ergebnis ist:
Jane Apple Null John Pear 72
Das Problem ist, dass die Funktion COALESCE() nicht mit Wertemengen funktioniert, sondern nur mit Listen.
Viele Themen erwähnten die Verwendung von MIN() oder MAX() anstelle von COALESCE() als Lösung. Aber das löst das Problem nicht, weil ich den neuen Wert benötige, um den alten Wert zu überschreiben, nicht den niedrigsten oder höchsten Wert.
P粉9795861592023-09-07 20:00:18
由于COALESCE()
不是一个聚合函数,而只能使用给定的值列表,我在这个帖子中找到了@jsowa的解决方法:为什么“COALESCE”不能与“GROUP BY”一起使用?
我们可以使用SUBSTRING_INDEX(GROUP_CONCAT())
来替代COALESCE()
。
请特别注意GROUP_CONCAT()中的ORDER BY子句。 缺点是分隔符必须是任何值中未使用的字符。
SELECT user, SUBSTRING_INDEX(GROUP_CONCAT(fruit ORDER BY created_at DESC SEPARATOR '|'), '|', 1) AS fruit, SUBSTRING_INDEX(GROUP_CONCAT(number ORDER BY created_at DESC SEPARATOR '|'), '|', 1) AS number, FROM mytable GROUP BY user;
返回结果
Jane Apple Null John Pear 72