我正在尝试计算名称的出现,但是无论该名称是否已被计数,我都希望返回每一行。数据看起来像;
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
答案 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