web-dev-qa-db-fra.com

MySQL obtient la première valeur non nulle après le regroupement par

J'ai un grand tableau avec des données qui ne sont pas uniques mais qui doivent l'être. Cette table est le résultat de plusieurs sélections d'union et n'est donc pas une table réelle. Je ne peux pas en faire un tableau réel pour d'autres raisons.

Toutes les tables UNION ont une colonne email qui sera finalement unique. Les enregistrements résultants ressemblent à ceci:

1   [email protected]   Ozzy
2   [email protected]   Tony
3   [email protected]  Steve
4   [email protected]   
13  [email protected]  Tony
14  [email protected]   Ozzy
15  [email protected]  Dave
16  [email protected]   Tim

Comme vous pouvez le voir, certains e-mails apparaissent plusieurs fois avec des noms différents ou des noms inexistants. Lorsque j'ajoute un GROUP BY email clause à la fin, les résultats ressemblent à ceci:

1   [email protected]   Ozzy
2   [email protected]   Tony
3   [email protected]  Steve
4   [email protected]   
13  [email protected]  Tony

Comme vous pouvez le voir, l'email 4 n'a pas de nom car il a choisi la première entrée avec NULL pour un nom. Ensuite, j'ai essayé d'utiliser GROUP_CONCAT qui donnait aux résultats l'aspect suivant:

1   [email protected]   Ozzy
14  [email protected]   Ozzy,Tony
15  [email protected]  Dave,Steve
16  [email protected]   Tim
13  [email protected]  Tony

Comme vous pouvez le voir, maintenant tout le monde a un nom mais certaines lignes ont plus d'un nom concaténé. Ce que je veux faire, c'est GROUP BY email et choisissez le premier NOT NULL entrée de chaque colonne pour que chaque ligne ressemble théoriquement à ceci:

1   [email protected]   Ozzy
2   [email protected]   Tony
3   [email protected]  Steve
4   [email protected]   Tim
13  [email protected]  Tony

J'ai essayé d'utiliser COALESCE mais cela ne fonctionne pas comme prévu. Ma requête actuelle ressemble à ceci:

SELECT
    id,
    email,
    `name`
FROM
(
    SELECT
        email,
        `name`
    FROM
        multiple_tables_and_unions
) AS emails

GROUP BY email

J'ai supprimé le code de la table temporaire car il contient de nombreuses tables mais toutes sélectionnent les colonnes email et name. Essentiellement, j'ai besoin d'une fonction comme GROUP_COALESCE mais malheureusement ça n'existe pas. Quelles sont mes options?

Merci

33
Ozzy

Essayez d'utiliser MAX, comme ceci:

SELECT
    email,
    MAX(`name`)
FROM
(
    SELECT
        email,
        `name`
    FROM
        multiple_tables_and_unions
) AS emails

GROUP BY email
39
Aziz Shaikh