一意ではないが一意である必要があるデータを含む大きなテーブルがあります。このテーブルは複数のユニオン選択の結果なので、実際のテーブルではありません。他の理由で実際のテーブルにすることはできません。
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
のような関数が必要ですが、残念ながら存在しません。私のオプションは何ですか?
ありがとう
次のようにMAX
を使用してみてください:
SELECT
email,
MAX(`name`)
FROM
(
SELECT
email,
`name`
FROM
multiple_tables_and_unions
) AS emails
GROUP BY email