如何根据其他2个表中列的结果类型获取结果

时间:2012-09-08 07:01:47

标签: mysql database

我有一个名为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。

2 个答案:

答案 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_btable_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_btable_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