我正在尝试通过比较表中的名字和姓氏列来查找重复项。名字可以是名字,也可以是首字母。
通过阅读其他帖子,我设法弄清楚了如何获得重复的姓氏,并列出了名字的第一个字母。但我不确定如何只显示姓氏和名字的第一个字母匹配的行。
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发布于 2012-02-09 08:18:02
我不太明白你想要什么。您提供了查询、当前表和预期结果。
我刚刚创建了您的表,运行了您的查询并获得了预期的结果。这有什么问题呢?
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
发布于 2012-02-09 01:47:59
你可能不想一直使用首字母,例如,如果你总是去掉首字母,你可能会认为Bob X和Bill X是一样的。所以你需要检查三个大小写。
所以你可以使用Mysql的字符串方法来检查名字的长度和大小写是否正确。
发布于 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,名字,姓氏)
选择
\*从…
#temp l内连接
#temp r在……上面
left(l.firstname, 1) = left(r.firstname, 1)和
l.surname = r.surname哪里
l.id < r.iddrop表#temp
这样做的不利之处在于史蒂文和斯坦利的较量。我建议你考虑创建一个名字别名表,并使用它来标准化名字。
https://stackoverflow.com/questions/9198160
复制相似问题