Mysql 使用sql,如何获取具有重复计数的行?
如何使用select语句计算重复的行(其中日期和名称相同) 这是我的桌子Mysql 使用sql,如何获取具有重复计数的行?,mysql,sql,Mysql,Sql,如何使用select语句计算重复的行(其中日期和名称相同) 这是我的桌子 id date name 1 01/02/12 sam 2 01/02/12 john 3 02/04/12 eddie 4 01/06/12 joe 5 01/02/12 john 6 01/02/12 john 7 02/04/12 eddie 8 01/05/12 eddie 9 01/07/12
id date name
1 01/02/12 sam
2 01/02/12 john
3 02/04/12 eddie
4 01/06/12 joe
5 01/02/12 john
6 01/02/12 john
7 02/04/12 eddie
8 01/05/12 eddie
9 01/07/12 joe
结果应该是这样的:
id date name count
1 01/02/12 sam 1
01/02/12 john 3
02/04/12 eddie 2
4 01/06/12 joe 1
8 01/05/12 eddie 1
9 01/07/12 joe 1
select id, date, name, count(*)
from mytable
group by id, date, name
having count(*) > 1
我需要结果集中的第三列,它的值将是count列。此外,如果计数超过1,我不需要id(我认为这无论如何都是不可能的)。我正在使用mysql
谢谢你的建议。类似这样的建议:
id date name count
1 01/02/12 sam 1
01/02/12 john 3
02/04/12 eddie 2
4 01/06/12 joe 1
8 01/05/12 eddie 1
9 01/07/12 joe 1
select id, date, name, count(*)
from mytable
group by id, date, name
having count(*) > 1
大概是这样的:
id date name count
1 01/02/12 sam 1
01/02/12 john 3
02/04/12 eddie 2
4 01/06/12 joe 1
8 01/05/12 eddie 1
9 01/07/12 joe 1
select id, date, name, count(*)
from mytable
group by id, date, name
having count(*) > 1
你可以写:
SELECT MIN(id) AS id, date, name, COUNT(1) AS `count`
FROM table_name
WHERE ...
GROUP BY date, name
;
这将始终提供组中最少的id
。如果您特别希望在存在重复项时第一个字段为NULL
,那么您可以将MIN(id)
更改为CASE-when-COUNT(1)>1,然后将NULL-ELSE-MIN(id)END
,但听起来您并不关心这一点?您可以编写:
SELECT MIN(id) AS id, date, name, COUNT(1) AS `count`
FROM table_name
WHERE ...
GROUP BY date, name
;
select date, name, count(id) as counter
from mytable
group by date, name
having count(id) > 1
这将始终提供组中最少的
id
。如果您特别希望在存在重复项时第一个字段为NULL
,那么您可以将MIN(id)
更改为CASE when COUNT(1)>1,然后将NULL ELSE MIN(id)END
,但听起来您并不关心这一点?这没有意义id
似乎是主键;如果按分组,则计数(*)
将始终为1
。(即使您解决了这个问题——OP的示例结果确实包含非重复行,因此HAVING
子句是错误的。)这没有意义id
似乎是主键;如果按分组,则计数(*)
将始终为1
。(即使您解决了这个问题——OP的示例结果确实包含非重复行,因此HAVING
子句是错误的。)检查这个:检查这个:我喜欢这个方法,似乎是最清晰的答案,并且不需要子查询。您还可以获得所有ID(当重复时)将其添加到选择列表中:GROUP\u CONCAT(id)与allId一样,您实际上不需要MIN(id)
。MySQL将允许您使用id
获取组中一行的id(它不保证是哪一行)。不过,其他一些RDBMS在这方面更迂腐。@IlmariKaronen:我很清楚这一功能,但我不想使用它,也不想推荐它。我很确定它的主要目的是混淆和误导。(例外:如果我通过一个表的主键JOIN
ing和GROUP
ing,那么我有时会利用该功能来处理其他列。但就是这样。)我喜欢这种方法,似乎是最清晰的答案,并且不需要子查询。而且你也可以获得所有ID(当重复时)将其添加到选择列表中:GROUP\u CONCAT(id)作为allId
此外,您实际上不需要MIN(id)
。MySQL将允许您仅使用id
获取组中一行的id(它不保证是哪一行)。不过,其他一些RDBMS在这方面更迂腐。@IlmariKaronen:我很清楚这一功能,但我不想使用它,也不想推荐它。我很确定它的主要目的是混淆和误导。(例外情况:如果我通过一个表的主键JOIN
ing和GROUP
inging,那么我有时会利用该功能来处理其他列。但仅此而已。)
select date, name, count(id) as counter
from mytable
group by date, name
having count(id) > 1