ユーザーが含まれているというテーブルがあります
(Table A)
Users
user_id
username
user_type[1,2]
(Table B) if user_type=1
user_id
full_name
(Table C) if user_type=2
user_id
full_name
単一のクエリを実行して単一のレコード セットを取得したいのですが、それは PHP mysql で可能ですか。
これを試して:
SELECT table_a.*, COALESCE(table_b.full_name,table_c.full_name) AS full_name
FROM table_a
LEFT OUTER JOIN table_b ON table_b.user_id = table_a.user_id
LEFT OUTER JOIN table_c ON table_c.user_id = table_a.user_id WHERE 1;
を使用します。これは、指定された条件LEFT OUTER JOINで結合することを意味します。table_bただし、 の各行についてtable_a、 で一致する行が見つかったかどうかに関係table_bなく、その行が返されtable_aます。一致する行が見つからない場合、table_b列は単に NULL です。と同じことtable_c。
次に、すべてのtable_a列を選択します。ただし、ここでは からの列と からの列の 2 つの列full_nameがあります。それらをマージするために使用します。table_btable_cCOALESCE
COALESCE最初の非NULL値を返します。
table_bに一致する行または に一致する行があることがわかっているtable_cので、問題ありません。table_bただし、 と の両方で一致する行が見つかると、問題が発生しますtable_c。
ONこのリスクは、句条件を追加して以下を取得することで軽減できます。
SELECT table_a.*, COALESCE(table_b.full_name,table_c.full_name) AS full_name
FROM table_a
LEFT OUTER JOIN table_b
ON table_b.user_id = table_a.user_id AND table_a.user_type = 1
LEFT OUTER JOIN table_c
ON table_c.user_id = table_a.user_id AND table_a.user_type = 2
WHERE 1;
それでも、 と の各ユーザーに対して 1 行のみが存在することを確認する必要がありtable_bますtable_c。
代わりに、オプションで次のようにCOALESCE使用できます。CASE
SELECT table_a.*, CASE user_type WHEN 1
THEN table_b.full_name
ELSE table_c.full_name END AS full_name
...
または次のIFような関数を使用します: SELECT table_a.*, IF(user_type=1,table_b.full_name,table_c.full_name) AS full_name ...
テーブルとUNION後で両方を使用できますJOINtableA
SELECT a.User_ID,
a.`username`,
b.full_name,
a.user_type
FROM tableA a
(
SELECT user_ID, full_name
FROM tableB
UNION
SELECT user_ID, full_name
FROM tableC
) b ON a.User_ID = b.User_ID
-- WHERE a.user_type = 1 -- add extra condition here