我有一个varchar列的表,我想找到在这个列中有重复值的所有记录。我可以使用什么查询来查找重复项?
当前回答
SELECT *
FROM mytable mto
WHERE EXISTS
(
SELECT 1
FROM mytable mti
WHERE mti.varchar_column = mto.varchar_column
LIMIT 1, 1
)
ORDER BY varchar_column
这个查询返回完整的记录,而不仅仅是不同的varchar_column。
这个查询不使用COUNT(*)。如果有很多重复项,COUNT(*)是昂贵的,并且不需要整个COUNT(*),只需要知道是否有两行具有相同的值。
这是通过相关查询底部的LIMIT 1,1来实现的(本质上意味着“返回第二行”)。EXISTS只在前面提到的第二行存在时才返回true(即至少有两行具有相同的varchar_column值)。
当然,在varchar_column上建立索引将大大加快此查询的速度。
其他回答
SELECT *
FROM mytable mto
WHERE EXISTS
(
SELECT 1
FROM mytable mti
WHERE mti.varchar_column = mto.varchar_column
LIMIT 1, 1
)
ORDER BY varchar_column
这个查询返回完整的记录,而不仅仅是不同的varchar_column。
这个查询不使用COUNT(*)。如果有很多重复项,COUNT(*)是昂贵的,并且不需要整个COUNT(*),只需要知道是否有两行具有相同的值。
这是通过相关查询底部的LIMIT 1,1来实现的(本质上意味着“返回第二行”)。EXISTS只在前面提到的第二行存在时才返回true(即至少有两行具有相同的varchar_column值)。
当然,在varchar_column上建立索引将大大加快此查询的速度。
SELECT DISTINCT a.email FROM `users` a LEFT JOIN `users` b ON a.email = b.email WHERE a.id != b.id;
根据levik的回答来获取重复行的id,如果服务器支持的话,可以执行GROUP_CONCAT(这将返回一个以逗号分隔的id列表)。
SELECT GROUP_CONCAT(id), name, COUNT(*) c
FROM documents
GROUP BY name
HAVING c > 1;
如果你想删除重复使用DISTINCT
否则使用这个查询:
SELECT users.*,COUNT(user_ID) as user FROM users GROUP BY user_name有用户>
下面的代码将找到所有使用了不止一次的product_id。每个product_id只能得到一条记录。
SELECT product_id FROM oc_product_reward GROUP BY product_id HAVING count( product_id ) >1
代码取自:http://chandreshrana.blogspot.in/2014/12/find-duplicate-records-based-on-any.html
推荐文章
- PHP PDO:字符集,集名称?
- Group_concat order by
- 如何在MySQL中查看日志文件?
- 我如何把一个'if子句'在一个SQL字符串?
- 如何在Mac OS Lion上从命令行启动MySQL服务器?
- 为什么MYSQL的高LIMIT偏移量减慢查询?
- MySQL选择列不为空的位置
- 哪个更快:多个单个INSERT还是一个多行INSERT?
- 搜索mysql数据库中出现的所有字符串
- 如何使用MySQL DECIMAL?
- 警告用户/local/mysql/data目录不属于mysql用户
- 添加一个复合主键
- 无法添加或更新子行:外键约束失败
- 如何从本地机器mysqldump远程数据库
- 如何正确地创建复合主键- MYSQL