2

私が取り組んでいるサイトには、管理者、応募者、レビュー担当者の3種類のユーザーがいます。これらの各グループには、保存する必要のあるいくつかの基本情報(名前、ID、電子メールなど)と、それぞれに固有のデータが含まれます。users特定のグループごとに、固有のデータを格納するためのテーブルとテーブルを作成しました。

  • ユーザー:id、f_name、l_name、email、user_type
  • users_admin:id、user_id、office、emp_id
  • users_applicant:id、user_id、dob、address
  • users_reviewer:id、user_id、active_status、address、phone

user_type「1」(申請者)のユーザーがログインした場合、完全なレコードを取得するためJOINにテーブルにログインする必要があります。users_applicantsを使用してみましたUNIONが、テーブルの列が大きく異なります。

ユーザーのタイプに基づいてJOIN、正しいテーブルに送信する条件付きクエリを作成する方法はありますか?私はこれを完全に間違った方法で行っていますか?

よろしくお願いします!

4

3 に答える 3

2

さて、結局、あなたのテーブルはすでに欠陥があります。なぜ各タイプのテーブルがあるのですか?これらすべてのフィールドをテーブルに入れてみませんかusers、またはuser_detailsテーブル(一般的でないデータフィールド用に追加のテーブルが本当に必要な場合)を入れてみませんか?現在、リレーショナルの観点から、実際には4つの独立したユーザーテーブルを作成しています。

では、なぜタイプテーブルに代理キーがあるのでしょうか。user_idすでに(唯一の)主キーではないのはなぜですか?

これを変更した場合、必要なのは必要なデータを取得するためのユーザーIDだけであり、すでにそれを取得しています(または、ユーザータイプを取得することもできません)。

于 2012-12-20T17:45:26.537 に答える
1

プログラムで実行するか、一連のCASEsとLEFT JOINsを使用してこれを実行できます。

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バージョンは(プログラムで生成しない限り)保守性は低くなりますが、わずかに高速になるはずです。

いずれの場合も、適切なフィールドで更新されたインデックスを保持することをお勧めします。

于 2012-12-20T17:37:39.470 に答える
1

代わりに、このようなテーブル構造を再構築することをお勧めします。

テーブルを作成する

users_types : 
id 
type

次に、外部キーを使用して別のテーブルユーザーを作成します

users :     
id 
f_name 
l_name 
email 
office 
emp_id 
dob 
address 
active_status 
phone 
users_types_id

そして、データを挿入する必要がある場合は、特定のユーザーに必要のないフィールドにnullを挿入します。また、IDに基づいてレコードをフェッチするだけです。また、左結合を使用すると、ユーザータイプの名前が表示されます。

于 2012-12-20T17:42:34.540 に答える