Comment regrouper les lignes MySQL en utilisant une combinaison de valeurs non nulles
P粉002023326
P粉002023326 2023-09-06 21:35:03
0
1
584

Comment fusionner/combiner des lignes en sélectionnant la dernièrevaleur non nulle de chaque colonne dans le résultat groupé ?

id Utilisateur Fruits Nombres Temps de création
1 Jane Pomme vide 2022-01-01
2 Jean Pastèque 32 2022-01-02
3 Jean vide 72 2022-01-03
4 Jean Poire vide 2022-01-04

Les méthodes suivantes ne fonctionneront pas :

SELECT
  user,
  COALESCE(fruit) as fruit,
  COALESCE(number) as number,
FROM mytable
GROUP BY user
ORDER BY created_at DESC

J'espère que le résultat est :

Jane   Apple   Null
John   Pear    72

Le problème est que la fonction COALESCE() ne fonctionne pas avec des ensembles de valeurs, mais uniquement avec des listes.

De nombreux sujets ont mentionné l'utilisation de MIN() ou MAX() au lieu de COALESCE() comme solution. Mais cela ne résout pas le problème car j'ai besoin que la nouvelle valeur écrase l'ancienne valeur, pas la valeur la plus basse ou la plus élevée.

P粉002023326
P粉002023326

répondre à tous(1)
P粉979586159

Puisque COALESCE() n'est pas une fonction d'agrégation mais ne peut fonctionner qu'avec une liste de valeurs donnée, j'ai trouvé la solution de contournement de @jsowa dans cet article : Pourquoi « COALESCE » ne fonctionne pas avec « GROUP BY » ?

Nous pouvons utiliser SUBSTRING_INDEX(GROUP_CONCAT()) à la place SUBSTRING_INDEX(GROUP_CONCAT())来替代COALESCE().

Veuillez prêter une attention particulière à la clause ORDER BY dans GROUP_CONCAT(). L'inconvénient est que le délimiteur doit être un caractère unused dans n'importe quelle valeur.

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;

Retour des résultats

Jane   Apple   Null
John   Pear    72
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal