Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/232.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/72.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
Php 运行新的Sql查询与在类似的数据集中循环-什么更有效?_Php_Mysql_Sql_Arrays_Database - Fatal编程技术网

Php 运行新的Sql查询与在类似的数据集中循环-什么更有效?

Php 运行新的Sql查询与在类似的数据集中循环-什么更有效?,php,mysql,sql,arrays,database,Php,Mysql,Sql,Arrays,Database,我想遍历一个数据集,看看其中是否有重复项。我想知道哪种方式对服务器更有效。运行数据集并向数据库发送新查询,或者使用第二个嵌套for循环运行数据集 我认为代码示例将使它更容易理解 SELECT * FROM contacts; 假设此查询生成一个数组: [0] {id: 1, firstname: 'John', lastname: 'Smith'} [1] {id: 2, firstname: 'Michael', lastname:'Jones'} ... [99] {id: 100, fi

我想遍历一个数据集,看看其中是否有重复项。我想知道哪种方式对服务器更有效。运行数据集并向数据库发送新查询,或者使用第二个嵌套for循环运行数据集

我认为代码示例将使它更容易理解

SELECT * FROM contacts;
假设此查询生成一个数组:

[0] {id: 1, firstname: 'John', lastname: 'Smith'}
[1] {id: 2, firstname: 'Michael', lastname:'Jones'}
...
[99] {id: 100, firstname: 'Jerry', lastname:'Brown'}
并保存到php数组中:

$data
现在让我们假设我想在$data中遍历每个联系人,然后查看是否有同名和姓氏相同的联系人。 哪种方法更有效

1:

2:


当然,如果我完全错了,有更好的方法一起做,我会很高兴学习

最有效的方法是让数据库完成工作。这是一般规则。数据库优化器有比通过数组循环更多的选项。数据库服务器通常比运行应用程序的节点更强大。 而且,与只返回您想要的结果相比,传回所有数据可能相对昂贵。尽管如此,也有例外,但很少有例外

如果需要名称对,则可以执行以下操作:

select firstname, lastname, count(*) as cnt
from contacts
group by firstname, lastname
having cnt > 1;
如果希望原始行是重复行,则我建议存在:


对于此查询,您需要contactslastname和firstname上的索引。

两者都不需要。从contacts group by firstName中选择firstName、lastName、count*,lastName的count*>1可在需要时获取所需数据;如果您需要更多数据,如ID或其他数据;基于first/lastname运行第二个查询以仅获取这些记录。基于数据库集的处理速度将比任何人能写的都快。您好,我不知道您到底想要什么,但您肯定应该构建一个请求,并将所有条件都放在其中…@xQbert好的,我理解。我没想到。这样好多了。不过,我想补充一点:如果我不想检查重复的总数,而是类似的名称,该怎么办。使用soundex进行类似模式匹配的声音也有其他模式匹配,soundex只是一个例子。Jaro-Winkler模糊逻辑匹配是另一种。看:你刚好在一个好日子赶上了我:P你可能想调整你的问题,在你的匹配中包括相似的名字。但这些都很棘手。一旦走上这条路,误报和可能的错误结果/匹配的机会就会增加。1/2战斗就是知道要寻找什么。希望这能让你走上一条更有成效的道路。
for($i = 0 ; $i < sizeof($data) ; $i++){
    for($j = $i+1; $j < sizeof($data); $i++){
        if($data[$i]['firstname'] === $data[$j]['firstname'] && $data[$i]['lastname'] === $data[$j]['lastname']){
            #log contacts;
        }
    }
}
select firstname, lastname, count(*) as cnt
from contacts
group by firstname, lastname
having cnt > 1;
select c.*
from contacts c
where exists (select 1
              from contacts c2
              where c2.firstname = c.firstname and c2.lastname = c.lastname and
                    c2.id <> c.id
             );