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

标签 mysql select duplicates

我想从下表中选择 fname 列中具有相似值的所有行作为顺序中的第一行。 IOW 从此表中我想检索 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/38747754/

相关文章:

sql - sql从选择中插入到表中,没有重复(需要更多然后是DISTINCT)

c# - 检查是否在文本文件中找到项目

mysql - 需要递归逻辑的 SQL 查询

mysql - 查找具有特定学生的类(class)

jquery - 从更改时的选择中获取值(value)

php - 从 Codeigniter 中的多个选择框中获取值

c++ - 如何避免在字符串数组中重复输入?

mysql - 字段列表中的列 'lang_id' 不明确

Python - 导入 mysql - IDLE/工作 Visual Studio/不工作

sql - Postgresql如何从文本数据中获取指定的文本