web-dev-qa-db-ja.com

MySQLはグループ化後に最初の非null値を取得します

一意ではないが一意である必要があるデータを含む大きなテーブルがあります。このテーブルは複数のユニオン選択の結果なので、実際のテーブルではありません。他の理由で実際のテーブルにすることはできません。

UNIONされたすべてのテーブルには、最終的に一意になる電子メール列があります。結果のレコードは次のようになります。

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のような関数が必要ですが、残念ながら存在しません。私のオプションは何ですか?

ありがとう

33
Ozzy

次のようにMAXを使用してみてください:

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

GROUP BY email
39
Aziz Shaikh