SF:查询以检索重复项

时间:2018-04-03 11:59:26

标签: mysql doctrine-orm

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查询答案。

1 个答案:

答案 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

这将只获得您需要的结果。