加入

时间:2015-08-04 22:05:03

标签: mysql

我有一个章节表,其中大约有17个条目都属于一本书。

chapters:
 --------------------------
|  id  | book_id | content |
 --------------------------
|   1  |    1    |   ...   |
|   2  |    1    |   ...   |
|   3  |    1    |   ...   |
|   4  |    1    |   ...   |
|   5  |    1    |   ...   |
|  ... |    1    |   ...   |
 --------------------------

还有一个图书馆表,可以将用户链接到他们保存的图书:

library:
 ----------------
| user | book_id |
 ----------------
|   1  |    1    |
|   1  |    2    |
|   2  |    1    |
|   3  |    1    |
|   4  |    1    |
|  ... |    1    |
 ----------------

我可以使用:

SELECT COUNT(*) FROM chapters WHERE book_id = 1

并且表正确输出17因为书1有17章

如果我这样做:

SELECT COUNT(*) FROM library WHERE book_id = 1

我也得到5的正确结果,因为5个用户已将书1添加到他们的库中。

但是,我似乎无法使用JOIN将两个查询组合在一起。我想要输出类似这样的SQL代码:

output:
 -----------------------------
|  book  | chapters | readers |
 -----------------------------
|    1   |    17    |    5    |
 -----------------------------

4 个答案:

答案 0 :(得分:0)

select c.book_id, count(c.id) as chapters, count(l.user) as readers
from chapters c
join library l on l.book_id = c.book_id
where c.book_id = 1
group by c.book_id

答案 1 :(得分:0)

//检查以下内容:

select "1" as book,
    (SELECT COUNT( * ) FROM chapters WHERE book_id = 1) as chapters, 
    (SELECT COUNT( * ) FROM library WHERE book_id = 1) as readers
from dual;

答案 2 :(得分:0)

如果尝试下面的查询,结果集将包括libary中的所有行,本章中的章节为85行(17x5):

select c.book_id, c.id as chapters, l.user as readers
from chapters c
inner join library l on l.book_id = c.book_id
where c.book_id = 1;
  

只要两个表中的列之间存在匹配,INNER JOIN关键字就会选择两个表中的所有行。

您可以阅读更多Here

然而,为了获得唯一的行数,即。来自85记录结果集的17章和5位读者必须使用如下所示的计数:

select c.book_id, count(distinct(c.id)) as chapters, count(distinct(l.user)) as readers
from chapters c
inner join library l on l.book_id = c.book_id
where c.book_id = 1;

您可以阅读有关count distinct here的更多信息。

答案 3 :(得分:0)

有一个答案:

select c.book_id, count(distinct c.id) as chapters, count(distinct l.user) as readers
from chapters c
left join library l on l.book_id = c.book_id
where c.book_id = 1

或所有书籍:

select c.book_id, count(distinct c.id) as chapters, coalesce(count(distinct l.user), 0) as readers
from chapters c
left join library l on l.book_id = c.book_id
group by c.book_id
相关问题