Mysql 使用sql,如何获取具有重复计数的行?

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

如何使用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    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
ing
ing,那么我有时会利用该功能来处理其他列。但仅此而已。)
select date, name, count(id) as counter
from mytable
group by date, name
having count(id) > 1