如何用 select 连接 2 个表并在单个查询中计数

How to join 2 tables with select and count in single query

我需要加入 2 tables(Person 和 PersonLine)。结果应包含来自 Person table 的 idname 列以及每个 id 来自 PersonLine Table 的 personlineid 列的计数。但是 sql 查询 returns 总数 personlineid。任何人都可以帮助形成 sql.

人:

ID          NAME            AGE
100         John            25
101         James           30
102         Janet           35

个人专线:

ID          NAME            PERSONLINEID
100         John            1
100         John            2
100         John            3
101         James           1
101         James           2
102         Janet           1

SQL:

SELECT P.ID, CNT.COUNT_PERSONLINE, P.NAME 
    FROM PERSON P 
    LEFT JOIN PERSONLINE PL 
    ON P.ID = PL.ID,
    (SELECT count(PL.PERSONLINEID) cnt FROM PERSON P LEFT JOIN PERSONLINE PL ON P.ID = PL.ID WHERE 
    P.ID = PL.ID) cnt

加入 Table(预期):

ID              COUNT_PERSONLINE            NAME
100             3                           John
101             2                           James
102             1                           Janet

加入 Table(实际):

ID              COUNT_PERSONLINE            NAME
100             6                           John
101             6                           James
102             6                           Janet

对于您的示例数据,您甚至不需要 Person table -- 因为您似乎在两个 table 中有多余的 table。您可能应该解决这个问题,但是:

select pl.id, pl.name, count(*)
from personline pl
group by pl.id, pl.name;

您的计数只是计算 table 的 join 中的所有行——这就是所有行。一个简单的聚合就足够了,即使您认为 join 仍然是必要的。

编辑:

persons 中有很多列,您有多种选择。一种方法是将它们放在 group by:

select pl.id, pl.name, p.col1, p.col2, count(*)
from persons p join
     personline pl
     on p.id = pl.id
group by pl.id, pl.name, p.col1, p.col2

另一种方法是在 join:

之前进行聚合
select p.*, pl.cnt
from person p join
     (select pl.id, pl.name, count(*) as cnt
      from personline pl
      group by pl.id, pl.name
     ) pl
     on p.id = pl.id;

或者,相关子查询:

select p.*, (select count(*) from personline pl where p.id = pl.id)
from person;