从一个表中选择所有值,再加上一个返回1/0的列,判断另一个表中是否存在记录

lmvvr0a8  于 2021-06-20  发布在  Mysql
关注(0)|答案(1)|浏览(223)

这个问题在这里已经有答案了

根据另一个表的内容在mysql中选择布尔值(2个答案)
两年前关门了。
我需要一些mysql查询的帮助,这让我头痛。
基本上我有两个相关的表格。第一个表叫做“books”,它包含关于一本书的基本信息。然后我有一个名为“user\u 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\u books表有两个主键:ub\u userid和ub\u bookid。
现在我需要做一个查询,返回books表中的所有图书,对于每本图书,返回给定用户的评级,如果user\u 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
非常感谢你的帮助。

i1icjdpr

i1icjdpr1#

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 记录,然后 books 记录将被复制。但是,它展示了如何针对缺少的行(外部连接)进行连接,并测试该外部连接行是否存在或缺少。
下面是一个针对mysql 5.6的sql fiddlehttp://sqlfiddle.com/#!9/b70ff8/4/0型

相关问题