首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >查找名字可以是首字母或全名的重复名称

问查找名字可以是首字母或全名的重复名称
EN

Stack Overflow用户
提问于 2012-02-09 01:12:21
回答 3查看 1.3K关注 0票数 0

我正在尝试通过比较表中的名字和姓氏列来查找重复项。名字可以是名字,也可以是首字母。

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

代码语言:javascript
复制
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

目前,此查询将返回

代码语言:javascript
复制
1  | joe       | bloggs
2  | j         | bloggs
3  | s         | bloggs

结果我想只包含可能的副本。

代码语言:javascript
复制
1  | joe       | bloggs
2  | j         | bloggs
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-02-09 08:18:02

我不太明白你想要什么。您提供了查询、当前表和预期结果。

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

代码语言:javascript
复制
SELECT  FROM table1 AS a
INNER JOIN (
  SELECT surname FROM table1
  GROUP BY surname
  HAVING COUNT(*) > 1
) AS b ON a.surname = b.surname

这将有效地产生您预期的结果:

代码语言:javascript
复制
joe | bloggs
j   | bloggs

还是我错过了什么?

重读之后。你希望只得到这个吗?

代码语言:javascript
复制
j | bloggs

如果是这种情况,请使用以下命令:

代码语言:javascript
复制
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

编辑:

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

代码语言:javascript
复制
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

票数 0
EN

Stack Overflow用户

发布于 2012-02-09 01:47:59

你可能不想一直使用首字母,例如,如果你总是去掉首字母,你可能会认为Bob X和Bill X是一样的。所以你需要检查三个大小写。

  1. 两个名字都是首字母
  2. 两个名字都不是首字母
  3. 只有一个名字是首字母

所以你可以使用Mysql的字符串方法来检查名字的长度和大小写是否正确。

票数 0
EN

Stack Overflow用户

发布于 2012-02-09 07:09:00

我会像这样把表连接起来:

select * into #temp from (

选择1,'joe','bloggs‘联合

选择2,'j','bloggs‘联合

选择3,'f','doe‘联合

SELECT 4,'frank','spencer‘联合

选择5,'steven','woo‘联合

选择6,'steve','woo‘联合

SELECT 7,'stanley','woo‘

)x (id,名字,姓氏)

选择

代码语言:javascript
复制
 \*

从…

代码语言:javascript
复制
 #temp l

内连接

代码语言:javascript
复制
 #temp r

在……上面

代码语言:javascript
复制
 left(l.firstname, 1) = left(r.firstname, 1)

和

代码语言:javascript
复制
 l.surname = r.surname

哪里

代码语言:javascript
复制
 l.id < r.id

drop表#temp

这样做的不利之处在于史蒂文和斯坦利的较量。我建议你考虑创建一个名字别名表,并使用它来标准化名字。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9198160

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档