2012-01-10 50 views
1

我还没有代码,因为我从未写过这样的查询。我公司的电子商务网站提供首次购买20%的折扣。我们发现偷偷摸摸的人创建多个帐户来利用。此时创建一​​个帐户时,它只会检查一个匹配的电子邮件。比较数据库项目以查找重复项

老板想要什么时,只要他登录到管理区域,查询就会运行并显示具有相同名字和姓氏的任何帐户以及其他项目。唯一可以这样做的方式是选择所有用户,并循环搜索所有匹配项。我认为这可以通过一个查询来完成。这里是我想要的一个例子:

$res=$mysqli->query("SELECT * from users"); 
while($user = $res->fetch_array()){ 

    $res2=$mysqli->query("SELECT * FROM users WHERE firstname='".$user->firstname."' 
           OR lastname='".$user->lastname."' .... "); 
    while($user2 = $res2->fetch_array()){ 
     print $user->id . " matches " . $user2->id; 
    } 

} 

可以这样使用一个查询完成,如果是的话,请proive一个例子,或链接。我感谢所有帮助

+0

阅读SQL中的“group by”。这应该可以帮助你。 – Danny 2012-01-10 15:58:19

+0

尽管有些练习写出了实际的查询,但是您可以使用&count()组获得重复计数的列表,然后选择您的上司希望两个名字匹配的计数> 1 – MrGlass 2012-01-10 15:58:55

+0

姓氏,还是他想要名字或姓氏上的匹配?前者似乎对我最明智,但你的查询中有'OR'! – 2012-01-10 16:02:49

回答

7

加入同一个表:

SELECT * FROM users u1 LEFT JOIN users u2 ON (u1.FirstName = u2.FirstName) 
    WHERE u1.Id != u2.Id; 
+0

并且可能也是姓氏? – 2012-01-10 16:00:27

+0

这是完美的,我想我可以在括号内放置尽可能多的ON子句项目?我不经常使用JOIN – 2012-01-10 16:01:29

0

像这样的东西可能会给你的想法。

select field, GROUP_CONCAT(id SEPARATOR ',') from table group by field having count(field) > 2;