So gruppieren Sie MySQL-Zeilen mithilfe einer Kombination von Nicht-Null-Werten
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.
1 antwortet
由于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
Hot-Tools-Tags
Hot Questions
Hot Tools
Sammlung der Laufzeitbibliothek vc9-vc14 (32+64 Bit) (Link unten)
Laden Sie die Sammlung der Laufzeitbibliotheken herunter, die für die Installation von phpStudy erforderlich sind
VC9 32-Bit
VC9 32-Bit-Laufzeitbibliothek für die integrierte Installationsumgebung von phpstudy
Vollversion der PHP-Programmierer-Toolbox
Programmer Toolbox v1.0 PHP Integrierte Umgebung
VC11 32-Bit
VC11 32-Bit-Laufzeitbibliothek für die integrierte Installationsumgebung von phpstudy
SublimeText3 chinesische Version
Chinesische Version, sehr einfach zu bedienen





