我有一个章节表,其中大约有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 |
-----------------------------
答案 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