-1

ユーザーが含まれているというテーブルがあります

(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 で可能ですか。

4

2 に答える 2

2

これを試して:

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 ...

于 2012-09-08T07:05:46.213 に答える
1

テーブルと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
于 2012-09-08T07:16:07.677 に答える