2013-04-03 86 views
5

我有 '人民'T-SQL SELECT与GROUP BY ID

  • ID
  • 名称
  • 年龄

而且表“表备注':

  • ID
  • 文本
  • FK_Author

我想选择的音符数从人表中的所有作者和他们的名字和年龄,但我希望将它通过人员ID,而不是姓名。有很多情况下,人们有相同的名字,但ID显然总是不同的。

实施例(输入)

人物:

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

NOTES:

╔════╦═══════╦═══════════╗ 
║ 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 ║ 
╚═══════╩═════╩════════════╝ 

当我选择数据时,如果我想选择此列,我也必须按名称进行分组,因为如果我没有,我会得到错误。

回答

5

既然你想从表People所有记录,您需要使用LEFT JOIN因此没有任何纪录Notes任何用户将被包括在具有thev零的totalCount值列表与Notes加入。

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 ║ 
╚════╩═══════╩═════╩════════════╝ 
+0

这是错误的答案,就像我说我不要被名字/年龄蚂蚁群。这个专栏对于不同的人可以是相同的 – Ellbar

+2

NO。你错了。这个查询会给你你需要的结果。请记住,您在“GROUP BY”条款 –

+0

中包含“ID”,请参阅此处演示http://www.sqlfiddle.com/#!3/81929/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 
+0

您必须按选择中要显示的所有字段进行分组,但由于您先按ID进行分组,他们将全部不同。 –

2

您可以使用子查询也来完成这一任务原样

select people.Name,people.Age,(select count(notes.id) 
           from notes 
           where notes.FK_Author= people.id) 
from people; 
2

你也可以首先从票据表的计数,然后离开与人民表连接像下面。

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 |