所以我正在运行一些脚本来处理重复记录的问题。 我是在需要严格匹配的阶段做到这一点。
我注意到的是我记录的记录少于我能识别的记录。
我用来识别重复记录的脚本如下
SELECT p.firstname, p.surname, p.email, REPLACE(p.mobile, ' ', ''), count(*) as `duplicates`
FROM person p
WHERE (p.firstname!='' and p.firstname != '?' and p.firstname != '*')
AND (p.surname!='' and p.surname != '?' and p.surname != '*' )
AND (p.email != 'xxxxx' OR p.mobile != 'xxxxx')
GROUP BY p.firstname, p.surname, p.email, p.mobile
HAVING COUNT(*) > 1;
所以这告诉我重复的记录,其中找到了第一个姓名,姓氏和电子邮件或手机号码的完全匹配。
然后我遍历其中的每一个并合并记录,并删除旧记录。
在我经历了这个之后,我注意到我仍然有一些重复的遗留,所以我试图选择其中的一些。
SELECT p.person_id, p.firstname, p.surname, p.email, REPLACE(p.mobile, ' ', '') `p.mobile`
FROM person p
WHERE p.firstname='Ross' AND p.surname='Allen' and p.email='xxxxx'
ORDER BY p.person_id
此查询产生以下结果
(道歉,但由于保密,我必须传感图像,但你必须承认我的话,person_id 4510和person_id 5035拥有相同的手机号码)
现在,获取这些重复记录的实际查询从先前查询的结果集中获取其值。现在,如果我也输入手机号码。我得到0结果。 (我有双重检查,检查并检查quadribble,确认两个记录中的电话号码实际上完全相同,因为它们是varchar字段。
任何人都知道这里发生了什么?
some table details:
Engine: InnoDB
Row format: Compact
Table rows: 42,538
Coalation:" utf8_general_ci
答案 0 :(得分:1)
也许手机号码有前导空格或尾随空格。在查询标识重复项的查询中,您将从移动电话号码中删除空格。您可以尝试将where子句更改为:
WHERE p.firstname = 'Ross' AND p.surname = 'Allen' AND p.email = 'xxxxx'
AND REPLACE(p.mobile, ' ', '') = '[MOBILENUMBER]'