9

我有“”的桌子

  • ID
  • 姓名
  • 年龄

和带有“注释”的表格:

  • ID
  • 文本
  • FK_作者

我想从人员表中选择所有作者的笔记计数以及他们的姓名和年龄,但我想按人员 ID 分组,而不是姓名。很多情况下,人名相同,但ID显然总是不同的。

示例(输入)

人们:

╔════╦═══════╦═════╗
║ ID ║ NAME  ║ AGE ║
╠════╬═══════╬═════╣
║  1 ║ John  ║  12 ║
║  2 ║ Annie ║  29 ║
║  3 ║ John  ║  44 ║
╚════╩═══════╩═════╝

笔记:

╔════╦═══════╦═══════════╗
║ ID ║ TEXT  ║ FK_AUTHOR ║
╠════╬═══════╬═══════════╣
║  1 ║ 'aaa' ║         1 ║
║  2 ║ 'aaa' ║         1 ║
║  3 ║ 'aaa' ║         2 ║
║  4 ║ 'aaa' ║         2 ║
║  5 ║ 'aaa' ║         3 ║
╚════╩═══════╩═══════════╝

预期结果:

╔═══════╦═════╦════════════╗
║ NAME  ║ AGE ║ TOTALCOUNT ║
╠═══════╬═════╬════════════╣
║ John  ║  12 ║          2 ║
║ Annie ║  29 ║          2 ║
║ John  ║  44 ║          1 ║
╚═══════╩═════╩════════════╝

当我选择数据时,如果我想选择此列,我也必须按名称分组,因为如果我不这样做,我会收到错误消息。

4

4 回答 4

13

由于您想从 table 获取所有记录People,因此您需要Notes通过 using将其加入,LEFT JOIN因此任何没有任何记录的用户Notes都将包含在列表中,其 v 值为totalCount0。

SELECT  a.ID, a.Name, a.Age,
        COUNT(b.FK_Author) totalCount
FROM    People a
        LEFT JOIN Notes b
            ON a.ID = b.FK_Author
GROUP   BY a.ID, a.Name, a.Age

要进一步了解有关联接的更多信息,请访问以下链接:

输出

╔════╦═══════╦═════╦════════════╗
║ ID ║ NAME  ║ AGE ║ TOTALCOUNT ║
╠════╬═══════╬═════╬════════════╣
║  1 ║ John  ║  12 ║          2 ║
║  2 ║ Annie ║  29 ║          2 ║
║  3 ║ John  ║  44 ║          1 ║
╚════╩═══════╩═════╩════════════╝
于 2013-04-03T11:20:58.093 回答
4
SELECT P.ID,P.Name,P.Age,COUNT(N.ID)
FROM People P 
INNER JOIN Notes N ON N.FK_Author = P.ID
GROUP BY P.ID,P.Name,P.age
于 2013-04-03T11:22:28.563 回答
3

您也可以使用子查询来完成此任务 -

select people.Name,people.Age,(select count(notes.id) 
                                 from notes 
                                where notes.FK_Author= people.id)
from people;
于 2013-04-03T11:26:29.393 回答
3

您还可以先从 Notes 表中获取计数,然后使用 People 表左连接,如下所示。

小提琴演示(感谢 JW 的小提琴)

select name, age, Notate_Count
from People p left join (
        select fk_author, count(*) Notate_Count
        from Notes 
        group by fk_author ) x
     on p.Id = x.fk_author
order by name --Ordering by name here, change as required

|  NAME | AGE | NOTATE_COUNT |
------------------------------
| Annie |  29 |            2 |
|  John |  44 |            1 |
|  John |  12 |            2 |
于 2013-04-03T11:27:06.193 回答