lev*_*vik 1471
做SELECT一个GROUP BY条款.假设name是要在以下位置找到重复项的列:
SELECT name, COUNT(*) c FROM table GROUP BY name HAVING c > 1;
Run Code Online (Sandbox Code Playgroud)
这将返回第一列中名称值的结果,以及该值在第二列中出现的次数.
max*_*yfc 220
SELECT varchar_col
FROM table
GROUP BY varchar_col
HAVING COUNT(*) > 1;
Run Code Online (Sandbox Code Playgroud)
Qua*_*noi 164
SELECT *
FROM mytable mto
WHERE EXISTS
(
SELECT 1
FROM mytable mti
WHERE mti.varchar_column = mto.varchar_column
LIMIT 1, 1
)
Run Code Online (Sandbox Code Playgroud)
此查询返回完整记录,而不仅仅是不同varchar_column的记录.
此查询不使用COUNT(*).如果有很多重复,COUNT(*)很昂贵,而且你不需要整体COUNT(*),你只需要知道是否有两行具有相同的值.
varchar_column当然,拥有一个索引会大大加快这个查询的速度.
Mat*_*don 132
GROUP_CONCAT如果你的服务器支持,你可以根据levik的答案来获取重复行的ID,这将返回逗号分隔的id列表.
SELECT GROUP_CONCAT(id), name, COUNT(*) c FROM documents GROUP BY name HAVING c > 1;
Run Code Online (Sandbox Code Playgroud)
小智 16
为了获取包含重复的所有数据,我使用了这个:
SELECT * FROM TableName INNER JOIN(
SELECT DupliactedData FROM TableName GROUP BY DupliactedData HAVING COUNT(DupliactedData) > 1 order by DupliactedData)
temp ON TableName.DupliactedData = temp.DupliactedData;
Run Code Online (Sandbox Code Playgroud)
TableName = 您正在使用的表。
DupliactedData = 您要查找的重复数据。
小智 12
SELECT *
FROM `dps`
WHERE pid IN (SELECT pid FROM `dps` GROUP BY pid HAVING COUNT(pid)>1)
Run Code Online (Sandbox Code Playgroud)
Tec*_*ink 11
假设您的表名为TableABC,您想要的列是Col,而T1的主键是Key.
SELECT a.Key, b.Key, a.Col
FROM TableABC a, TableABC b
WHERE a.Col = b.Col
AND a.Key <> b.Key
Run Code Online (Sandbox Code Playgroud)
这种方法优于上述答案的优势在于它给出了密钥.
小智 9
要查找Employee中名称列中有多少记录重复,下面的查询很有用;
Select name from employee group by name having count(*)>1;
Run Code Online (Sandbox Code Playgroud)
我没有看到任何JOIN aproaches,在重复方面有很多用途.
这个aproeach为您提供实际的双倍结果.
SELECT t1.* FROM my_table as t1
LEFT JOIN my_table as t2
ON t1.name=t2.name and t1.id!=t2.id
WHERE t2.id IS NOT NULL
ORDER BY t1.name
Run Code Online (Sandbox Code Playgroud)
小智 7
SELECT t.*,(select count(*) from city as tt
where tt.name=t.name) as count
FROM `city` as t
where (
select count(*) from city as tt
where tt.name=t.name
) > 1 order by count desc
Run Code Online (Sandbox Code Playgroud)
用您的表替换城市.将名称替换为您的字段名称
我的最终查询包含了一些有用的答案 - 结合group by,count和GROUP_CONCAT.
SELECT GROUP_CONCAT(id), `magento_simple`, COUNT(*) c
FROM product_variant
GROUP BY `magento_simple` HAVING c > 1;
Run Code Online (Sandbox Code Playgroud)
这提供了两个示例(逗号分隔)的ID,我需要的条形码以及重复的数量.
相应地更改表格和列.
小智 6
我看到上面的结果,如果你需要检查重复的单列值,查询将正常工作.例如电子邮件.
但是,如果您需要检查更多列并希望检查结果的组合,那么此查询将正常工作:
SELECT COUNT(CONCAT(name,email)) AS tot,
name,
email
FROM users
GROUP BY CONCAT(name,email)
HAVING tot>1 (This query will SHOW the USER list which ARE greater THAN 1
AND also COUNT)
Run Code Online (Sandbox Code Playgroud)
以@ maxyfc的答案进一步,我需要找到所有与重复的值返回的行,这样我就可以在编辑MySQL工作台:
SELECT * FROM table
WHERE field IN (
SELECT field FROM table GROUP BY field HAVING count(*) > 1
) ORDER BY field
Run Code Online (Sandbox Code Playgroud)
SELECT ColumnA, COUNT( * )
FROM Table
GROUP BY ColumnA
HAVING COUNT( * ) > 1
Run Code Online (Sandbox Code Playgroud)
我更喜欢使用窗口函数(MySQL 8.0+)来查找重复项,因为我可以看到整行:
WITH cte AS (
SELECT *
,COUNT(*) OVER(PARTITION BY col_name) AS num_of_duplicates_group
,ROW_NUMBER() OVER(PARTITION BY col_name ORDER BY col_name2) AS pos_in_group
FROM table
)
SELECT *
FROM cte
WHERE num_of_duplicates_group > 1;
Run Code Online (Sandbox Code Playgroud)
小智 5
我从此改进:
SELECT
col,
COUNT(col)
FROM
table_name
GROUP BY col
HAVING COUNT(col) > 1;
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
594734 次 |
| 最近记录: |