Php 运行新的Sql查询与在类似的数据集中循环-什么更有效?
我想遍历一个数据集,看看其中是否有重复项。我想知道哪种方式对服务器更有效。运行数据集并向数据库发送新查询,或者使用第二个嵌套for循环运行数据集 我认为代码示例将使它更容易理解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
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
);