查找重复名称,其中名字可以是初始名称或全名

时间:2012-02-08 17:12:21

标签: mysql

我试图通过比较表格中的名字和姓氏列来查找重复项。名字可以是名字或首字母。

阅读其他帖子我已设法弄清楚如何获取重复的姓氏并列出名字的第一个字母。但我不确定如何只显示姓氏与名字第一个字母匹配的行。

SELECT * 
FROM table AS a
INNER JOIN (

SELECT LEFT( firstname, 1 ) , surname
FROM table
GROUP BY surname
HAVING COUNT( * ) > 1
) AS b ON a.surname = b.surname

id | firstname | surname
**************************
1  | joe       | bloggs
2  | j         | bloggs
3  | s         | bloggs
4  | f         | doe
5  | frank     | spencer

目前此查询将返回

1  | joe       | bloggs
2  | j         | bloggs
3  | s         | bloggs

结果我希望只包含可能的重复项。

1  | joe       | bloggs
2  | j         | bloggs

3 个答案:

答案 0 :(得分:0)

你可能不想一直使用缩写,例如,如果你总是剥离首字母,你可能会认为Bob X与Bill X相同。 所以你需要检查三个案例。

  1. 这两个名字都是首字母
  2. 这两个名字都是非首字母
  3. 只有一个名字是初始的
  4. 因此,您可以使用Mysql的字符串方法来检查firstname的长度并检查正确的大小写。

答案 1 :(得分:0)

我会像这样加入桌子:

从*中选择*到#temp SELECT 1,'joe','bloggs'UNION
SELECT 2,'j','bloggs'UNION
选择3,'f','doe'联盟
SELECT 4,'frank','spencer'UNION
SELECT 5,'steven','woo'UNION
SELECT 6,'steve','woo'UNION
SELECT 7,'stanley','woo'
)x(id,firstname,surname)

选择
    *

    #temp l
内连接     #temp r

    left(l.firstname,1)= left(r.firstname,1)

    l.surname = r.surname
其中
    l.id< r.id

drop table #temp

这样做的缺点是史蒂文和斯坦利的比赛。我建议你考虑创建一个名字别名表,并使用它来标准化名字。

答案 2 :(得分:0)

我不太明白你想要的东西。 Yor提供了一个查询,您当前的表格和预期的结果。

我刚创建了你的表,运行你的查询并得到了预期的结果。这有什么问题?

SELECT  FROM table1 AS a
INNER JOIN (
  SELECT surname FROM table1
  GROUP BY surname
  HAVING COUNT(*) > 1
) AS b ON a.surname = b.surname

这实际上会产生您的预期结果:

joe | bloggs
j   | bloggs

或者我错过了什么?

重新阅读之后...你期望只得到这个吗?

j | bloggs

如果是这种情况,请使用:

SELECT * FROM table1 AS a
INNER JOIN (
  SELECT surname FROM table1
  GROUP BY surname
  HAVING COUNT(*) > 1
) AS b ON a.surname = b.surname
WHERE CHAR_LENGTH(firstname) = 1

修改

在正确解释了预期结果之后,我得出结论:查询应该是:

SELECT a.firstname, a.surname FROM t1 AS a
INNER JOIN (
  SELECT LEFT(firstname, 1) AS firstChar, surname FROM t1
  GROUP BY surname, firstChar
  HAVING COUNT(surname) > 1
) AS b ON a.surname = b.surname AND b.firstChar = LEFT(a.firstname, 1)

工作example