mysql - 查找具有重复/相似列值的行 MySQL

标签 mysql select duplicates

我想从下表中选择在 fname 列中具有相似值的所有行作为其顺序中的第一行。我想从此表中检索 ID 为 2,5 和 7 的行(因为“anna”位于“anna”和“michaela 之后>”和“michaal”出现在“michael”之后。

+----+------------+----------+
| id | fname      | lname    |
+----+------------+----------+
|  1 | anna       | milski   |
|  2 |  anna      | nguyen   |
|  3 | michael    | michaels |
|  4 | james      | bond     |
|  5 | michaela   | king     |
|  6 | bruce      | smart    |
|  7 | michaal    | hardy    |
+----+------------+----------+

我目前的情况是这样的:

select *, count(fname) cnt 
from users group by soundex(fname) 
having count(soundex(fname)) > 1;

但由于我将其分组,结果是

+----+----------+----------+-----+
| id | fname    | lname    | cnt |
+----+----------+----------+-----+
|  1 | anna     | milski   |   2 |
|  3 | michael  | michaels |   3 |
+----+----------+----------+-----+

我要检索的是这个:

+----+----------+----------+-----+
| id | fname    | lname    | cnt |
+----+----------+----------+-----+
|  2 |  anna    | nyugen   |   2 |
|  5 | michaela | king     |   3 |
|  7 | michaal  | hardy    |   3 |
+----+----------+----------+-----+

我应该对查询进行哪些更改?我尝试删除“group by”但它改变了结果(我可能是错的,还没有广泛测试)。

最佳答案

我重新阅读了您最初的问题,并提出了以下解决方案:

SELECT *
FROM   users
WHERE  id IN
       (SELECT id
       FROM    users t4
               INNER JOIN
                       (SELECT  soundex(fname) AS snd,
                                COUNT(*)       AS cnt
                       FROM     users          AS t5
                       GROUP BY snd
                       HAVING   cnt > 1
                       )
                       AS t6
               ON      soundex(t4.fname)=snd
       )
AND    id NOT IN
       (SELECT  MIN(t2.id) AS wanted
       FROM     users t2
                INNER JOIN
                         (SELECT  soundex(fname) AS snd,
                                  COUNT(*)       AS cnt
                         FROM     users          AS t1
                         GROUP BY snd
                         HAVING   cnt > 1
                         )
                         AS t3
                ON       soundex(t2.fname)=snd
       GROUP BY snd
       );

它有点过于复杂,但它确实有效并提供了您所要求的:)

关于mysql - 查找具有重复/相似列值的行 MySQL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4936371/

相关文章:

php - 如何更新数据库中的多个字段

java - Hibernate-MySQL 连接

mysql - 使用 phpmyadmin 的 mySQL INNER JOIN 语法

php - 通过中间表筛选基于相似类别的结果

mysql - SUM 重复行数

python - 查找并删除 CSV 文件中的重复项

Dropbox 和 GData API 中的 IOS 重复类 JSON

mamp - 使用 mamp 2.0.1 记录 mysql 查询将无法工作

python - 增加特定行的列中的整数值

mysql - 多个 "SELECT DISTINCT"查询