MySQL:返回表A的所有行,如果表B中存在记录,则返回true | false

时间:2014-07-16 05:48:59

标签: mysql sql join left-join

我有一个sales_cat表和一个user_cat表。

sales_cat

  • id_cat
  • 名称

user_cat

  • ID
  • id_user
  • id_cat

我需要获取所有sales_cat行,并使用user_cat表为特定用户加入,指示该用户是否具有该类别。例如,对于id_user = 4,它应该返回:

id_cat | name  | selected
1      | kids  | 1
2      | men   | 1
3      | women | 0

当然,“selected”字段实际上是一个取决于user_cat中是否存在链接记录的值。我在sqlfiddle中设置了表格结构。

我当前的解决方案仅返回链接数据:

SELECT sales_cat.id_cat, sales_cat.name
FROM sales_cat
LEFT JOIN user_cat ON user_cat.id_cat = sales_cat.id_cat
WHERE user_cat.id_user = 4

......正在回归:

id_cat | name
1      | kids
2      | men

我仍然缺少“已选择”列和 3 |女性排。

有什么想法吗?谢谢!

3 个答案:

答案 0 :(得分:3)

尝试这样

SELECT sales_cat.id_cat, sales_cat.name,case when
user_cat.id is null then 0 else 1 end as "selected" FROM 
sales_cat LEFT JOIN user_cat ON 
user_cat.id_cat = sales_cat.id_cat and 
user_cat.id_user = 4 

http://sqlfiddle.com/#!2/395ba/25谢谢@Phil

答案 1 :(得分:3)

试试这个:

select distinct 
s.id_cat, 
s.name, 
case when u.id_user is null then 0 else 1 end selected
from sales_cat s
left join user_cat u on s.id_cat = u.id_cat 
and (u.id_user = 4 or u.id_user is null)

虽然该方法类似于Satson的答案,但我们将空检查从user_cat移至id_user

答案 2 :(得分:-1)

你可以试试这个:

SELECT sales_cat.id_cat,sales_cat.name,user_cat.id_user不为null时的情况,然后选择其他0结束 来自sales_cat LEFT JOIN user_cat ON(user_cat.id_cat = sales_cat.id_cat和user_cat.id_user = 4)