代码之家  ›  专栏  ›  技术社区  ›  Osakr

从表中选择所有值,再加上返回1/0的列,以确定其他表中是否存在记录[重复]

  •  -1
  • Osakr  · 技术社区  · 6 年前

    此问题与以下内容完全相同:

    我需要一些关于MySQL查询的帮助,这让我头疼。

    基本上我有两个相关的表。第一个表称为“books”,它包含关于一本书的基本信息。然后我还有一个名为“用户手册”的表,它与前一个表和其他表(在问题中不相关)相关。这就是books表的样子:

    | b_id       |    b_name     |   b_description    |
    ---------------------------------------------------
    | 1          |    Book1      |   Description1     |
    | 2          |    Book2      |   Description2     |
    

    “用户图书”表包含以下内容:

    | ub_userid  | ub_bookid  | ub_rating  | ub_default  |
    ------------------------------------------------------
    | 10         | 1          | 5          | 1           |
    

    user_books表有两个主键:ub_userid和ub_bookid。

    现在,我需要进行一个查询,返回books表中的所有书籍,对于每本书,返回给定用户的评级,如果用户的books表中有该书的记录,返回1,但是如果没有任何书籍的bookid返回0。

    给定用户10,我想要的输出是:

    | b_id  | b_name | b_description  | ub_default  | active |
    ----------------------------------------------------------
    | 1     | Book1  | Description1   | 1           |  1     |
    | 2     | Book2  | Description2   | 0           |  0     |
    ----------------------------------------------------------
    

    我用的是MySQL5.7

    非常感谢您的帮助。

    1 回复  |  直到 6 年前
        1
  •  2
  •   Jeff Breadner    6 年前
    select 
      b.b_id, 
      b.b_name, 
      b.b_description, 
      coalesce(ub.ub_default, 0) as ub_default,
      case 
        when ub.ub_userid is null then 0 
        else 1 
      end as active  
    from books b left outer join 
         user_books ub 
         on ub.ub_bookid = b.b_id
    where
         ub.ub_userid = 10;
    

    这不进行任何聚合,因此如果您有多个 user_books 一份记录 books 记录,然后 记录将被复制。但是,它演示了如何针对缺少的行(外部联接)进行联接,并测试该外部联接行是否存在。

    这是一个用于MySQL5.6的SQL小提琴 http://sqlfiddle.com/#!9/b70ff8/4/0