SQL:使用来自两个不同表的计数

时间:2013-09-23 09:37:53

标签: sql oracle

如何为以下场景构建查询:

我有三张桌子:

  1. 图书(与peopleserno上的人关联)
  2. 视频(与peopleserno上的人关联)
  3. 我想创建一个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
    

    谢谢。

5 个答案:

答案 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

SQLFiddle demo

答案 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
相关问题