プログラムで実行するか、一連のCASE
sとLEFT JOIN
sを使用してこれを実行できます。
users
簡単にするために、タイプ1(通常のユーザー)、2(パワーユーザー)、または3(管理者)のユーザーを持つことができるテーブルを使用してこれを実行しましょう。通常のユーザーには電子メールがありますが電話はありません。パワーユーザーにはアドレスと「超大国」と呼ばれるフィールドがあり、管理者には電話番号だけがあります。
すべてに同じものを使用したいのでSELECT
、もちろん、これらすべてを自分のSELECT
:に配置する必要があります。
SELECT user.id, user.type, email, address, superpower, telephone
LEFT JOIN
そして、これらを回復する必要があります
FROM user
LEFT JOIN users_data ON (user.id = users_data.user_id)
LEFT JOIN power_data ON (user.id = power_data.user_id)
LEFT JOIN admin_info ON (user.id = admin_info.user_id)
これで、「未使用」フィールドはになりますがNULL
、デフォルトを指定できます。
SELECT
CASE WHEN user.type = 0 THEN email ELSE 'nobody@nowhere.com' END AS email,
CASE WHEN user.type = 1 OR user.type = 2 THEN ... ELSE ... END as whatever,
...
WHERE
それ自体に設定できる特定の条件。JOIN
たとえば、Jセクターの管理者のみが必要な場合は、次を使用できます。
LEFT JOIN admin_info ON (user.id = admin_info.user_id AND admin_info.sector = 'J')
ほとんどのsはほとんど返さないので、合計クエリ時間はそれほど悪くないはずJOIN
です(そして、ユーザーIDを指定すると、実際には何も返されません)。
を使用して同じことを行うこともできますUNION
。これはさらに高速です。
SELECT user.id, 'default' AS email, 'othermissingfield' AS missingfieldinthistable,
... FROM user JOIN user_data ON (user.id = user_data.user_id)
WHERE ...
UNION
SELECT user.id, email, 'othermissingfield' AS missingfieldinthistable,
... FROM user JOIN power_data ON (user.id = power_data.user_id)
WHERE ...
UNION
...
これで、ユーザーIDを指定すると、1つを除くすべてのクエリが非常に速く失敗します。各クエリには、同じWHERE
繰り返しに加えて、テーブル固有の条件があります。このUNION
バージョンは(プログラムで生成しない限り)保守性は低くなりますが、わずかに高速になるはずです。
いずれの場合も、適切なフィールドで更新されたインデックスを保持することをお勧めします。