如何连接两个表并获取空值

时间:2013-12-29 22:13:28

标签: mysql sql

我有三个表ColorShadeActivity

颜色

id     color
---    ------
1       red
2       green
3       white



Shade

   id      shade    
  ----    ------- 
     1      light    
     2        dark

的活动:

user_id  shade_id  color_id
------   --------  --------
1          1        1
1          1        2
2          2        3

我正在使用mysql,可以通过特定的阴影轻松找到属于用户的颜色:

select c.name, 'assigned'
from color c
left join activity a on c.id = a.color_id
where a.shade_id = 1 and a.user_id = 1;

以上将给我:

Color  Status
-----  -------
red    assigned
green  assigned

问题

但是,我希望列出所有属于assigned的所有颜色的列表,以及属于她的not assigned和不属于Color Status ----- ------- red assigned green assigned white not assigned 的颜色。

所以我想要

{{1}}

4 个答案:

答案 0 :(得分:1)

SELECT Color, B.shade_id Status
FROM Color A LEFT JOIN (SELECT * 
                      FROM Activity WHERE shade_id = 1) B
     ON A.id = B.color_id

NULL表示未分配。

答案 1 :(得分:1)

也可以加入shade表,如下所示

select name,
case when shade is null then 'Not Assigned'
else 'Assigned'
end as Status
from
(select c.name, s.shade
from color c
left join shade s on c.id = s.id
left join activity a on c.id = a.color_id
where a.shade_id = 1 and a.user_id = 1;
) tab

答案 2 :(得分:0)

SELECT c.name, 'assigned'
FROM Color c
LEFT JOIN Activity a
ON c.id = a.color_id
WHERE a.shade_id = 1 AND a.user_id = 1
UNION
SELECT c.name, 'unassigned'
FROM Color c
WHERE c.id NOT IN (
  SELECT a.color_id
  FROM Activity a
  WHERE a.shade_id = 1 AND a.user_id = 1);

或者,合并另外两个答案(说实话,我比我更喜欢):

SELECT Color, CASE WHEN B.shade_id IS NULL THEN 'Not Assigned'
ELSE 'Assigned'
END AS Status
FROM Color A
LEFT JOIN
(SELECT * FROM Activity WHERE shade_id = 1) B
ON A.id = B.color_id;

答案 3 :(得分:0)

只需将schade_id = 1条件从where子句移到加入条件(ON...

select c.name, 'assigned'
from color c
  left join activity a 
         on c.id = a.color_id 
        and a.shade_id = 1;