选择一个字段的计数大于一的位置


100

我想做这样的事情:

SELECT * 
  FROM db.table 
 WHERE COUNT(someField) > 1

如何在MySql中实现呢?

Answers:


146

使用HAVING,而非WHERE子句进行汇总结果比较。

以面值查询:

SELECT * 
  FROM db.table 
HAVING COUNT(someField) > 1

理想情况下,应该GROUP BYHAVING子句中定义适当的评估值,但是MySQL确实允许GROUP BY的隐藏列 ...

这是否是在为唯一的约束做准备someField?看起来应该是...


11
是否GROUP BY肯定需要(除非这是一些MySQL非标准的东西)?
马丁·史密斯

@马丁史密斯:以面值进行查询;解决了GROUP BY问题(包括隐藏列功能)。
OMG Ponies 2010年

“看起来应该是……”为什么?我需要对此进行教育:)
Dave

因此,如果它包含两个以上的非null someField值,则返回整个表;否则,将返回一个空结果集。
马丁·史密斯

@Dave:如果您必须定期检查并更正不良数据,您是否不想一开始就阻止这种情况发生?MySQL将唯一约束作为索引实现-有关更多信息,请参见CREATE INDEX文档
OMG Ponies 2010年

18
SELECT username, numb from(
Select username, count(username) as numb from customers GROUP BY username ) as my_table
WHERE numb > 3

3
唯一需要注意的是(至少在5.1.46-社区MySQL社区服务器(GPL)中)是“每个派生表都必须具有自己的别名”,这将使您的sql看起来像:SELECT用户名,numb from(选择用户名, count(username)as numb from
users

14

您也可以使用自我加入来做到这一点:

SELECT t1.* FROM db.table t1
JOIN db.table t2 ON t1.someField = t2.someField AND t1.pk != t2.pk


4

单程

SELECT t1.* 
FROM db.table t1
WHERE exists 
      (SELECT *
      FROM db.table t2 
      where t1.pk != t2.pk 
      and t1.someField = t2.someField)

1

正如OMG Ponies所说,having子句是您所追求的。但是,如果您希望得到的是离散的行而不是摘要(“具有”将创建摘要)-不能在单个语句中完成。在这种情况下,您必须使用两个语句。


1
并非完全正确-使用GROUP BY来操纵HAVING正在使用的内容。
OMG小马

1

我在Sql中两个表之间的分组依据上给出了一个示例:

Select cn.name,ct.name,count(ct.id) totalcity from city ct left join country cn on ct.countryid = cn.id Group By cn.name,ct.name Having totalcity > 2



1

对我来说,没有分组者只是返回空结果。因此,我想让分组为had陈述非常重要


-2

还应该提到的是,“ pk”应该是一个关键字段。自我加入

SELECT t1.* FROM db.table t1
JOIN db.table t2 ON t1.someField = t2.someField AND t1.pk != t2.pk 

作者:Bill Karwin提供的所有记录都是重复的,这正是我想要的。因为有些记录有两个以上,所以您可以多次获得相同的记录。我将所有内容写入具有相同字段的另一个表,以通过抑制关键字段来摆脱相同的记录。我试过了

SELECT * FROM db.table HAVING COUNT(someField) > 1

以上第一。从它返回的数据仅提供重复项之一,不到给您的重复项的1/2,但是如果您想要的话,那么计数就很好。


3
这不是一个真正的答案。
anon582847382 2014年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.