Подтвердить что ты не робот

MySQL получает первое ненулевое значение после группы

У меня есть большая таблица с данными, которые не уникальны, но должны быть. Эта таблица является результатом нескольких попыток объединения, поэтому не является фактической таблицей. Я не могу сделать его реальной таблицей по другим причинам.

Все таблицы UNION'd имеют столбец электронной почты, который в конечном итоге будет уникальным. Результирующие записи выглядят следующим образом:

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

Как вы можете видеть, некоторые письма появляются более одного раза с разными именами или несуществующими именами. Когда я добавляю предложение GROUP BY email в конце, результаты выглядят так:

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

Как вы можете видеть, адрес электронной почты 4 не имеет имени, потому что он выбрал первую запись с NULL для имени. Затем я попытался использовать GROUP_CONCAT, из-за чего результаты выглядели следующим образом:

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

Как вы можете видеть, теперь у каждого есть имя, но некоторые строки содержат более одного имени. То, что я хочу сделать, это GROUP BY email и выбрать первую запись NOT NULL для каждого столбца для каждой строки, чтобы теоретически выглядеть так:

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

Я пробовал использовать COALESCE, но он не работает должным образом. Мой текущий запрос выглядит так:

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

GROUP BY email

Я удалил код из временной таблицы, поскольку он содержит много таблиц, но все выбирают столбец email и name. По сути, мне нужна функция типа GROUP_COALESCE, но, к сожалению, ее не существует. Каковы мои варианты?

Спасибо

4b9b3361

Ответ 1

Попробуйте использовать MAX, например:

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

GROUP BY email