So gruppieren Sie MySQL-Zeilen mithilfe einer Kombination von Nicht-Null-Werten
P粉002023326
P粉002023326 2023-09-06 21:35:03
0
1
587

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粉002023326
P粉002023326

Antworte allen(1)
P粉979586159

由于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
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage