MySQL计数出现次数,但返回所有行

时间:2018-08-26 07:07:32

标签: mysql sql

我正在尝试计算名称的出现,但是无论该名称是否已被计数,我都希望返回每一行。数据看起来像;

ID |  NAME  
1     Peter 
2     Simone 
3     Otto
4     Cedric 
5     Peter 
6     Cedric
7     Cedric

以下每个唯一名称仅返回一行

select id, first_name, count(first_name)from table group by first_name

ID |  FIRST_NAME  | count(first_name)
1     Peter          2
2     Simone         1
3     Otto           1
4     Cedric         3

但是我试图返回每一行,例如

ID |  FIRST_NAME  | count(first_name)
1     Peter          2
2     Simone         1
3     Otto           1
4     Cedric         3
5     Peter          2
6     Cedric         3
7     Cedric         3

3 个答案:

答案 0 :(得分:2)

如果您使用的是MySQL版本> = 8.0,则可以使用窗口函数:

select id,
       first_name,
       count(*) over (partition by first_name)
from table

对于早期版本:

select id,
       first_name,
       (select count(*) from table where first_name = t.first_name)
from table t

答案 1 :(得分:1)

编辑:既然我已经看到了其他答案,为什么联接比使用相关子查询更好?因为对表中的每一行都执行了相关子查询。加入后,查询仅执行一次。


然后,您必须加入这些查询。

select * from
table 
inner join (
    select first_name, count(first_name) as name_count from table group by first_name
) qcounts on table.first_name = qcounts.first_name

还要注意,在查询中,您必须从select子句中删除id,因为既没有在group by子句中使用它,也没有在其上应用聚合函数。因此,将为该列返回一个随机行。
最好通过激活only_full_group_by sql模式让MySQL提醒您这一点。为此,您可以

set global sql_mode = concat(@@global.sql_mode, 'only_full_group_by');

答案 2 :(得分:1)

您可以使用相关子查询:

SELECT t1.id, 
       t1.first_name,
       (SELECT COUNT(id) 
        FROM table t2 
        WHERE t2.first_name = t1.first_name) AS total_count
FROM table t1