Maison  >  Questions et réponses  >  le corps du texte

Comment regrouper les lignes MySQL en utilisant une combinaison de valeurs non nulles

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粉002023326P粉002023326430 Il y a quelques jours577

répondre à tous(1)je répondrai

  • P粉979586159

    P粉9795861592023-09-07 20:00:18

    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

    répondre
    0
  • Annulerrépondre