我想从下表中选择在 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/