Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/59.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 - Fatal编程技术网

Mysql 如何修剪SQL并仍然在两个不同字段中查找具有重复数据的记录?

Mysql 如何修剪SQL并仍然在两个不同字段中查找具有重复数据的记录?,mysql,sql,Mysql,Sql,基本上,我正试图根据电话号码在数据库中找到所有可能的重复项。我的SQL很难看,而且需要很长时间,因为所有的选择。我如何改进它并仍然获得所有可能的副本 MySQL 5.5架构设置: create table contacts (id int, name varchar(255), phone1 varchar(255), phone2 varchar (255)); insert into contacts (id, name, phone1, phone2) values(1, 'abe',

基本上,我正试图根据电话号码在数据库中找到所有可能的重复项。我的SQL很难看,而且需要很长时间,因为所有的选择。我如何改进它并仍然获得所有可能的副本

MySQL 5.5架构设置

create table contacts (id int, name varchar(255), phone1 varchar(255), phone2 varchar (255));
insert into contacts (id, name, phone1, phone2) values(1, 'abe', 111, 122);
insert into contacts (id, name, phone1, phone2) values(2, 'abe', 111, 133);
insert into contacts (id, name, phone1, phone2) values(3, 'bob', 211, 222);
insert into contacts (id, name, phone1, phone2) values(4, 'carol', 233, 222);
insert into contacts (id, name, phone1, phone2) values(5, 'david', 311, 322);
insert into contacts (id, name, phone1, phone2) values(6, 'eve', 333, 311);
insert into contacts (id, name, phone1, phone2) values(7, 'fiona', 411, 422);
insert into contacts (id, name, phone1, phone2) values(8, 'gabe', 422, 433);
insert into contacts (id, name, phone1, phone2) values(9, 'harold', 511, 511);
SELECT id, name, phone1, phone2 FROM contacts
        WHERE (phone1 IN (SELECT phone1 FROM contacts GROUP BY phone1 HAVING count(phone1) > 1))
        OR (phone2 IN (SELECT phone2 FROM contacts GROUP BY phone2 HAVING count(phone2) > 1))
        OR (phone1 IN (SELECT phone2 FROM contacts))
        OR (phone2 IN (SELECT phone1 FROM contacts))
        ORDER BY phone1
查询1

create table contacts (id int, name varchar(255), phone1 varchar(255), phone2 varchar (255));
insert into contacts (id, name, phone1, phone2) values(1, 'abe', 111, 122);
insert into contacts (id, name, phone1, phone2) values(2, 'abe', 111, 133);
insert into contacts (id, name, phone1, phone2) values(3, 'bob', 211, 222);
insert into contacts (id, name, phone1, phone2) values(4, 'carol', 233, 222);
insert into contacts (id, name, phone1, phone2) values(5, 'david', 311, 322);
insert into contacts (id, name, phone1, phone2) values(6, 'eve', 333, 311);
insert into contacts (id, name, phone1, phone2) values(7, 'fiona', 411, 422);
insert into contacts (id, name, phone1, phone2) values(8, 'gabe', 422, 433);
insert into contacts (id, name, phone1, phone2) values(9, 'harold', 511, 511);
SELECT id, name, phone1, phone2 FROM contacts
        WHERE (phone1 IN (SELECT phone1 FROM contacts GROUP BY phone1 HAVING count(phone1) > 1))
        OR (phone2 IN (SELECT phone2 FROM contacts GROUP BY phone2 HAVING count(phone2) > 1))
        OR (phone1 IN (SELECT phone2 FROM contacts))
        OR (phone2 IN (SELECT phone1 FROM contacts))
        ORDER BY phone1
: |id |姓名|电话1 |电话2| |----|--------|--------|--------| |1 | abe | 111 | 122| |2 |安倍| 111 | 133| |3 |鲍勃| 211 | 222| |4 |卡罗尔| 233 | 222| |5 |大卫| 311 | 322| |6 |夏娃| 333 | 311| (7)菲奥娜(411)×422 |8 | gabe | 422 | 433| |9 |哈罗德| 511 | 511 |

试试这个

SELECT c1.id, c1.name, c1.phone1, c1.phone2 
FROM contacts AS c1
INNER JOIN (
    SELECT id, phone1, phone2
    FROM contacts
) AS c2 ON (c1.id <> c2.id AND (c1.phone1 = c2.phone1 OR c1.phone2 = c2.phone2))
GROUP BY c1.id
ORDER BY c1.phone1

是的,所有的箱子都有,而且速度很快!非常感谢你!我已经15年没有上数据库课了。“在(phone1)和(phone2)上放置索引”是什么意思?我是否需要将c2前缀添加到内部联接选择中的字段?实际上,这不起作用,它还将唯一的phone1或phone2拉入结果抱歉。。但是,关于“单一性”,问题中没有任何内容。你说你需要重新组织你的查询,也许可以加快速度。是的,它会给你所有的副本。你是什么意思?这没道理。请添加更多详细信息我非常感谢您的帮助,M0RTIS。这应该表明,即使是“ivan”联系人也被拉入结果中,即使他的手机不是其他任何人的手机的复制品。这才是真正的重点-尝试找到所有的重复-没有单一的实例,尽可能少的遍历。没有,但这很好。谢谢你的努力。我得把数据库设计书从存储器里挖出来。我在网上找过其他地方,只是没有用同样的方法来比较一个记录中的一个字段,并将其与另一个记录中的不同字段进行比较,如果两个字段相同,则抓取它们-哦,好吧,祝你好运!