我有一个名为users users的表
(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。
答案 0 :(得分: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
列。不过,我们现在有两个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;
但是,您需要确保table_b
和table_c
中每位用户只有1行。
您可以选择使用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
或使用{{1}}函数,例如: SELECT table_a。*,IF(user_type = 1,table_b.full_name,table_c.full_name)AS full_name ...
答案 1 :(得分:1)
您可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