ユーザーが含まれているというテーブルがあります
(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_b
table_c
COALESCE
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
後で両方を使用できますJOIN
tableA
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