【问题标题】:MySQL: Return all rows of table A and true|false if record exists in table BMySQL:如果表 B 中存在记录,则返回表 A 的所有行和 true|false
【发布时间】:2014-09-06 12:39:37
【问题描述】:

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

sales_cat

  • id_cat
  • 姓名

user_cat

  • 身份证
  • 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 |女性行。

有什么想法吗?谢谢!

【问题讨论】:

  • 这似乎很少发生,我不得不说;好问题!

标签: mysql sql join left-join


【解决方案1】:

你可以试试这个:

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

【讨论】:

    【解决方案2】:

    试试这个:

    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

    【讨论】:

      【解决方案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

      【讨论】:

        猜你喜欢
        • 2011-02-21
        • 2016-09-21
        • 2011-06-07
        • 1970-01-01
        • 1970-01-01
        • 2014-03-09
        • 1970-01-01
        • 1970-01-01
        • 2020-12-23
        相关资源
        最近更新 更多