在 Symfony Project 上,使用PHP和MySQL,我正在尝试找到一种方法,以获取一种方法,以获取所有行以查看两个字段的潜在重复用户仅:lastname,firstName。
我有一个标准用户表:
id firstname lastname email otherfield1 ...
1 john smith john.smith@yahoo.fr otherfield1value1 ...
2 john smith john.smith@gmail.com otherfield1value2 ...
3 john doe john.doe@gmail.com otherfield1value3 ...
4 john doe john.doe@gmail.com otherfield1value4 ...
5 jane doe jane.doe@somewhere.com otherfield1value5 ...
如果我做A:
SELECT GROUP_CONCAT(u1.id) FROM user AS u1 GROUP BY u1.firstName, u1.lastName HAVING count(u1.id) > 1;
我从预期获得所有重复ID
1,2
3,4
,但我想拥有所有重复项的所有信息:id,lastname,firstName,但其他字段:电子邮件,出生日期...使用group_concat我显然不能这样做:
SELECT GROUP_CONCAT(u1.id), email FROM user AS u1 GROUP BY u1.firstName, u1.lastName HAVING count(u1.id) > 1;
这使我按小组"只"一封电子邮件,因为它应该(但不按照我的意愿(:
1,2 john.smith@yahoo.fr
3,4 john.doe@gmail.com
我可以做SELECT GROUP_CONCAT(u1.id, ',', u1.email, ',', u1.otherfield SEPARATOR '|') FROM user AS u1 GROUP BY u1.firstName, u1.lastName HAVING count(u1.id) > 1;
这给我带来了完整的结果:
1,john.smith@yahoo.fr,otherfield1value1|2,john.smith@gmail.com,otherfield1value2
3,john.doe@gmail.com,otherfield1value3|4,john.doe@gmail.com,otherfield1value4
,但以非真正可用的形式:我将不得不将两次分开并循环浏览结果...对Symfony请求结果而不是最佳。
所以我想到了一个子查询带来ID并在子句中使用它。像
SELECT u.* FROM user u WHERE u.id IN (THE_SUBQUERY_FOR_DUPLICATE_IDS);
但是group_concat请求没有带来所有ID的列表,我只会得到ID组列表。
SELECT u.* FROM user u WHERE u.id IN (
SELECT GROUP_CONCAT(u1.id) FROM user AS u1 GROUP BY u1.firstName, u1.lastName HAVING count(u1.id) > 1
);
崩溃...由于子查询带有数组。
我想知道我是否可以将group_concat查询的结果限制为ID的常规列表:1,2,3,4 ...或者,如果有另一种方法可以为重复的用户(而不仅仅是IDS(引入一个查询所有信息吗?
我宁愿不必进行第一个查询,然后在PHP中加入ID,然后查询完整的结果(=所有字段(
当然,该请求最好在学说语言中 :),但是如果给出的话,我也可以调整本机MySQL查询答案。
我建议使用 INNER JOIN
,例如,以这样的方式适应它们:
SELECT GROUP_CONCAT(u1.id) var1, (...other variables...) FROM user AS u1 GROUP BY u1.firstName, u1.lastName
INNER JOIN
(SELECT GROUP_CONCAT(u1.id) var2 FROM user AS u1 GROUP BY u1.firstName, u1.lastName HAVING count(u1.id) > 1) duplicates_table
ON user.var1=duplicates_table.var2
这只会得到您需要的结果。