我有一个带有varchar列的表,我想在这个列中查找所有具有重复值的记录。我能用什么查询来查找重复项?
- 既然您提到了查找所有记录,我假设您需要知道关键字以及varchar列中的重复值。
- 我可以在得到值后很容易地找到键,我真的只需要一个所有重复值的列表。
与GROUP BYSELECT的条款。让我们说你的名字是想找到duplicates柱:
这将返回结果的值在第一列的名称和数量,这说明如何多的时间值在第二。
- 但是,如果无法获取具有重复值的行的ID,这有什么用处呢?是的,您可以对每个重复的值进行新的查询匹配,但是否可以简单地列出重复的值?
- @nobleuplift你可以做一个GROUP_CONCAT(id),它会列出ID。以我的答案为例。
- 谢谢@mattrardon。一个月前,一位同事向我展示了这个命令,但我很高兴它列在这里,因为否则这些查询中的很多都不是很有用。
- 是否可以这样做,但在只返回一列的子查询中?
- 如果它说"EDOCX1"〔1〕是什么意思?
- 多列操作如下:SELECT col1, col2, COUNT(*) c FROM table GROUP BY col1, col2 HAVING c > 1;。
- 我很困惑为什么这是公认的答案,为什么它有这么多的赞成票。操作人员问,"我想找到所有在这个列中有重复值的记录。"这个答案返回一个计数表。- 1
- 对于那些不了解HAVING如何工作的人来说——它只是结果集的一个过滤器,所以在主查询之后发生。
- 我发现使用having count(*) > 1更直观
- 优于@levik的答案,因为它没有添加额外的列。使其可用于IN()/NOT IN()。
- 在mysql activelab.io/code snippets/…的多个列上查找重复记录,我发现这个网站很有用。
这个查询返回完整的记录,不只是不同的varchar_column’s。
这不是COUNT(*)查询使用。如果有大量的duplicates,COUNT(*)是昂贵的,和你不需要整个COUNT(*),你只需要知道如果有两行具有相同的值。
有一个在线varchar_column指数将,当然,这大大加快查询。
- 很好。我在查询结束时添加了ORDER BY varchar_column DESC。
- 这应该是公认的答案,因为GROUP BY和HAVING只返回一个可能的副本。另外,使用索引字段而不是COUNT(*)的性能,以及ORDER BY将重复记录分组的可能性。
- 如上注释所述,此查询允许您列出所有重复的行。非常有用。
- 看着这个,我完全不明白它会如何工作。内部条件是否总是正确的,因为外部表中的任何行在内部表中也都可用,因此每一行至少都将始终匹配自身?我尝试了查询,得到了我怀疑的结果——每一行都返回了。但是有这么多的赞成票,我怀疑自己。内部查询是否缺少类似"and mto.id<>mti.id"的内容?当我加上这个的时候,它确实对我有用。
- @clox:注意相关查询底部的LIMIT 1, 1(实质上是"返回第二行")。只有当上述第二行存在时(即至少有两行具有相同值的varchar_column),EXISTS才会返回true。
- @奎斯诺啊,对。我理解当时的推理,没有注意到那部分。不过,就像我说的,这对我不起作用。它实际上返回所有行。即使我限制1554554,1,它仍然是。但是,如果我单独使用内部查询,它将按预期工作,并且只返回具有重复值的行。但是,如果我将order by添加到内部查询中,它会像您描述的那样工作,并且使其比条件慢一点。你确定没有这个命令或额外的内在条件它对你有效吗?顺便问一下,我用的是Mariadb,这是为什么?10.0.26-mariadb-3+deb.sury.org~xenial+1
- @CLOX:在2009年的时候,它确实在当时最新的MySQL版本上起了作用,否则我就不会发布它了。你能把一把小提琴放在一起吗?
- @奎斯诺没事。我试过将它放在sqlfiddle上,但自从我尝试运行的每个查询都被超时后,我就放弃了,除了创建模式之外。我确实发现,删除"exists"也可以使查询对我正常工作。
- 如果不进行分析,对于一个包含几千个索引行的非常小的表来说,这个查询花费了非常长的时间。耽搁了半秒到一秒。来自主答案的计数查询得到了解决,没有明显的延迟(并且它是先完成的,因此没有查询缓存)
建筑外levik’s)的入侵检测系统得到的回答,你可以重复的行,如果你的服务器支持的GROUP_CONCAT(这将返回它的逗号分隔列表的ID)。
- 一直以来都不知道group_concat()!非常有用。
- 非常感谢马特。这真的很有帮助!对于那些试图在phpmyadmin中更新的用户,如果您将id与以下函数放在一起:SELECT id, GROUP_CONCAT(id), name, COUNT(*) c [...],它将启用内联编辑,并且应该更新所有相关的行(或至少第一个匹配的行),但不幸的是,编辑会生成一个javascript错误…
- 然后您将如何计算要复制的ID数量?
- 如何不将所有ID分组,而是从第一个到最后一个列出;在它们旁边的列中列出它们各自的值?因此,它不将其分组,只显示id 1及其值、id 2及其值。即使ID的值相同。
- 非常有帮助的答案,这应该是最重要的,让更多的人看到它。我记得我在创建这样的列表时经历了多大的痛苦,它一直作为命令提供。
- 不,因为这很可能是最慢的。嵌套select是出了名的慢,因为它对返回的每一行执行。
你的表是一assuming《tableabc和你想要的是一列列和主键到T1是关键。
这种方法的优点是它使在上述答案的关键。
- +因为它很方便。然而,具有讽刺意味的是,结果本身包含了重复项(它列出了A和B,然后是B和A)。
- @Fabiensnauwaert您可以通过比较小于(或大于)来消除某些重复项。
发现如何许多记录是在中柱duplicates名员工,是helpful下面的查询;
我没有看到任何连接的方法有很多,其中使用duplicates而言。
该方法使现有的结果是双重的。
- 仅供参考-如果可能存在多个重复记录,您将希望"选择不同的somecol…",否则结果将包含找到的重复行的重复。
最后,我将回答一些查询的GROUP BY,是结合在一组记录,_ &;连接。
这提供了两个实例的ID(逗号分隔),需要有一barcode duplicates,以及如何。
相应的表和列的变化。
将你的城市与表。替换你的字段名称。
我看到上述的结果和查询将工作,如果你需要检查单细柱,这是重复的值。例如电子邮件。
如果你需要更多的检查与检查柱与想查询的结果组合的操作系统,这将工作精细。
以"maxyfc’s i需要进一步找到答案,这是返回的所有行的重复的值,所以我可以编辑他们在MySQL工作台:
以下是产品_将查找所有的ID使用一次以上。你只得到单_记录每个产品ID。
采取从代码:http://///find-duplicate-records-based-on-any.html 2014年12 chandreshrana.blogspot.in
1 2 3 4 5 6 7 8 9 10 11 12 13
| CREATE TABLE tbl_master
(`id` int, `email` varchar(15));
INSERT INTO tbl_master
(`id`, `email`) VALUES
(1, '[email protected]'),
(2, '[email protected]'),
(3, '[email protected]'),
(4, '[email protected]'),
(5, '[email protected]');
QUERY : SELECT id , email FROM tbl_master
WHERE email IN (SELECT email FROM tbl_master GROUP BY email HAVING COUNT(id ) > 1) |
我宁愿使用窗函数(8.0 + MySQL)发现duplicates因为i能看到整个行。
小提琴的演示数据库
- 值得注意的是,如果查询的列没有被索引,那么这个过程会非常缓慢,甚至可能无法完成。否则,我可以将a.email更改为a.*,并获取具有重复项的行的所有ID。
- @你在说什么?
- @迈克尔:好吧,因为我三岁了,我不能测试我使用的MySQL的任何版本,但是我在一个数据库上尝试了同样的查询,我选择的列没有索引,所以需要几秒钟才能完成。把它改成SELECT DISTINCT a.*几乎立刻解决了。
- @没问题啊。我能理解它是缓慢的…我担心的是"可能不会结束"。
- @迈克尔,我不记得系统中要运行这个查询的是哪个表,但是对于那些有数百万条记录的表,它们可能已经完成了,但是在一段时间内,我放弃了看到它何时真正完成的想法。
- 这是不正确的,因为它也会发现唯一的事件。0应该是1。
在删除重复的行与多个域的第一cancate他们,这是一个新的指定的键是唯一的不同的行,然后使用"GROUP BY列"命令来删除重复的和独特的重点:
- 你也能加一个解释吗?
- 为什么不使用CREATE TEMPORARY TABLE ...?稍微解释一下你的解决方案会很好。
如果你想删除重复使用DISTINCT
不使用这个查询:
SELECT users.*,COUNT(user_ID) as user FROM users GROUP BY user_name HAVING user > 1;
一个很晚的贡献……它帮助任何人的情况下waaaaaay线……我有一个任务:找到匹配对交易(真的)帐户的两端转移到银行帐户中的应用程序,它是能够确定的"从"和"到",为每个交易帐户间转移,所以我们这端跟踪:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| SELECT
LEAST(primaryid , secondaryid ) AS transactionid1 ,
GREATEST(primaryid , secondaryid ) AS transactionid2
FROM (
SELECT table1.transactionid AS primaryid ,
table2.transactionid AS secondaryid
FROM financial_transactions table1
INNER JOIN financial_transactions table2
ON table1.accountid = table2.accountid
AND table1.transactionid <> table2.transactionid
AND table1.transactiondate = table2.transactiondate
AND table1.sourceref = table2.destinationref
AND table1.amount = (0 - table2.amount )
) AS DuplicateResultsTable
GROUP BY transactionid1
ORDER BY transactionid1 ; |
结果是,在DuplicateResultsTable提供含匹配行(即重复)的交易,但它也提供了相同的事务ID,第二个是反向的对赛球队,所以在外SELECT有第一组的交易ID,这是做通过对确保该LEAST和GREATEST二是transactionid’s总是在相同的顺序的结果,这使得它的一个安全的GROUP第一,从而消除所有重复的比赛。然近百万的记录和通过确定在2岁以下的比赛只是12000 +秒。当然,transactionid是原发性的指数,这是真的。
尝试使用这个查询: