我有三个表Color
,Shade
和Activity
:
颜色
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}}
答案 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;