Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/83.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 优化sql查询以获取重复项_Mysql_Sql_Duplicates - Fatal编程技术网

Mysql 优化sql查询以获取重复项

Mysql 优化sql查询以获取重复项,mysql,sql,duplicates,Mysql,Sql,Duplicates,A具有以下sql查询: SELECT users.* FROM users users WHERE users.name <> '' and users.email <> '' and users.phone <> '' and users.name in ( SELECT name FROM users where name <> '' and name is not null

A具有以下sql查询:

SELECT users.* FROM users users

WHERE users.name <> '' and users.email <> '' and users.phone <> ''

and users.name in (  SELECT name
            FROM users
                where name <> '' and name is not null
            GROUP BY name
            HAVING count(name) > 1 )
and users.email in (  SELECT email
            FROM users
                where email <> '' and email is not null
            GROUP BY email
            HAVING count(email) > 1 )
and users.phone in (  SELECT phone
            FROM users
                where phone <> '' and phone is not null
            GROUP BY phone
            HAVING count(phone) > 1 )
ORDER BY users.name+users.email+users.phone ASC
LIMIT 0,200
不幸的是,它在大型数据库上运行非常慢。是否有任何选项可以优化此查询

查询结果的想法:获取数据库中具有重复项的所有记录,例如获取同名用户+相同电话+相同电子邮件


我尝试了内部连接,但似乎无法正常工作

如果您希望用户具有相同的姓名、电话和电子邮件,请使用group by:

如果需要所有行,而不仅仅是列表中的ID,请使用join:


注意:这些查询与原始查询不同。相反,它基于您在文本中描述的逻辑,例如获取同名用户+同一电话+同一电子邮件。

如果希望用户具有相同的姓名、电话和电子邮件,请使用group by:

如果需要所有行,而不仅仅是列表中的ID,请使用join:


注意:这些查询与原始查询不同。相反,它是基于您在文本中描述的逻辑,例如,获取同名用户+相同电话+相同电子邮件。

@Пааааааааааааа。第二个查询实际上是ANSI标准SQL,可以在任何数据库中运行。第一个使用的是group_concat,它在MySQL发明时就已经发明了。完美无所谓count*>1和多个分组都可以。谢谢。我有一个问题,若我只按名称分组运行第二个查询,它将使用90秒来执行语句。如果名字+姓氏70秒,但如果所有的结果都是5-10秒。表中至少有70k条记录。这是正常行为吗?@Пааааааааааа。用户姓名、电话、电子邮件索引应有助于提高性能。@Паааааааааааа1072。第二个查询实际上是ANSI标准SQL,可以在任何数据库中运行。第一个使用的是group_concat,它在MySQL发明时就已经发明了。完美无所谓count*>1和多个分组都可以。谢谢。我有一个问题,若我只按名称分组运行第二个查询,它将使用90秒来执行语句。如果名字+姓氏70秒,但如果所有的结果都是5-10秒。表中至少有70k条记录。这是正常行为吗?@Пааааааааааа。关于用户姓名、电话、电子邮件的索引应有助于提高性能。
select u.name, u.phone, u.email, group_concat(u.user_id)
from users u
group by u.name, u.phone, u.email
having count(*) > 1;
select u.*
from (select u.name, u.phone, u.email
      from users u
      group by u.name, u.phone, u.email
      having count(*) > 1
     ) udup join
     users u
     on u.name = udup.name and u.phone = udup.phone and u.email = udup.email
order by u.name, u.phone, u.email;