我有'人'
的表格列
带有'备注'的表格:
列
我想从人员表中选择所有作者的笔记数量及其名称和年龄,但我想按PERSON 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 ║
╚═══════╩═════╩════════════╝
当我选择数据时,如果我想选择此列,我也必须按名称分组,因为如果我不这样做,我会收到错误。
答案 0 :(得分:6)
由于您希望获取表People
中的所有记录,因此您需要使用Notes
将其与LEFT JOIN
一起加入,以便Notes
上没有任何记录的任何用户都将包含在列表中,其值为totalCount
,为零。
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 ║
╚════╩═══════╩═════╩════════════╝
答案 1 :(得分:3)
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
答案 2 :(得分:2)
您也可以使用子查询来完成此任务 -
select people.Name,people.Age,(select count(notes.id)
from notes
where notes.FK_Author= people.id)
from people;
答案 3 :(得分:2)
您也可以先从Notes表中获取计数,然后像下面一样使用People表连接。
Fiddle-demo(感谢J W为小提琴)
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 |