如何为以下场景构建查询:
我有三张桌子:
peopleserno
上的人关联)peopleserno
上的人关联)我想创建一个SQL,其中输出给出一行包含多少本书和一本书。特定人士已阅读/观看的视频。
示例输出:
John | 3 (books) | 2 (videos)
我尝试过这样的事情,但它不起作用:
select a.name,
count(b.serno) as books,
count(c.serno) as videos
from people a,
books b,
videos c
where a.serno = b.peopleserno
and a.serno = c.peopleserno
谢谢。
答案 0 :(得分:4)
你需要一个left join
来吸引那些没有阅读/观看任何内容的用户,然后你需要group by
用户来获取特定的用户数
select a.name,
count(distinct b.title) as books,
count(distinct c.title) as videos
from people a
left join books b on a.serno = b.peopleserno
left join videos c on a.serno = c.peopleserno
group by a.name
答案 1 :(得分:1)
select a.name,
( select count(b.serno) from books b where a.serno = b.peopleserno ) as books,
( select count(c.serno) from videos c where a.serno = c.peopleserno) as videos
from people a
答案 2 :(得分:1)
在子查询中进行计算是安全的,除非表中包含auto_incremented列。假设该表没有auto_incremented列,
SELECT a.Name,
COALESCE(b.TotalBook, 0) TotalBook,
COALESCE(c.TotalVideo, 0) TotalVideo
FROM People a
LEFT JOIN
(
SELECT peopleserno, COUNT(*) TotalBook
FROM Books
GROUP BY peopleserno
) b ON a.serno = b.peopleserno
LEFT JOIN
(
SELECT peopleserno, COUNT(*) TotalVideo
FROM Videos
GROUP BY peopleserno
) c ON a.serno = c.peopleserno
答案 3 :(得分:0)
您必须使用GROUP BY子句来填充您需要计算的字段。
答案 4 :(得分:0)
select a.name,
count(b.title)||' (books)' as books,
count(c.title)||' (videos)' as videos
from people a
left join books b on a.serno = b.peopleserno
left join videos c on a.serno = c.peopleserno
group by a.name
OR
select a.name,
( select count(b.serno) from books b where a.serno = b.peopleserno ) as books,
( select count(c.serno) from videos c where a.serno = c.peopleserno) as videos
from people a