在 Symfony项目上,使用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 ...
如果我这样做:
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;
这让我只有#34;按组分组的一封电子邮件(但不是我想要的):
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并在IN子句中使用它的子查询。 像
这样的东西SELECT u.* FROM user u WHERE u.id IN (THE_SUBQUERY_FOR_DUPLICATE_IDS);
但是GROUP_CONCAT请求并没有带来所有id的列表,我只得到一组OFID列表。
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 ...... 或者,如果有另一种方法可以为一个查询引入重复用户的所有信息(而不仅仅是ID)?
我宁愿不必先做第一个查询,然后在php中连接id,然后查询完整的结果(=所有字段)
当然请求最好是学说语言 :),但如果给出的话,我可以调整原生的mysql查询答案。
答案 0 :(得分:0)
我建议使用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
这将只获得您需要的结果。