我试图通过比较表格中的名字和姓氏列来查找重复项。名字可以是名字或首字母。
阅读其他帖子我已设法弄清楚如何获取重复的姓氏并列出名字的第一个字母。但我不确定如何只显示姓氏与名字第一个字母匹配的行。
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
答案 0 :(得分:0)
你可能不想一直使用缩写,例如,如果你总是剥离首字母,你可能会认为Bob X与Bill X相同。 所以你需要检查三个案例。
因此,您可以使用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