我想遍历一个数据集,看看其中是否有任何重复项。我想知道哪种方式对服务器来说更有效。遍历数据集并向数据库发送新查询,或者使用第二个嵌套 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:
for($i = 0 ; $i < sizeof($data) ; $i++){
#query db:
$newQuery = SELECT * FROM Contacts WHERE firstname=$data[$i]['firstname'] AND lastname=$data[$i]['lastname'];
if(sizeof($newQuery > 1)){
#log contacts.
}
}
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;
}
}
}
当然,如果我的做法是完全错误的,并且有更好的方法一起完成这一切,我会很乐意学习!
最佳答案
最有效的方法是让数据库来完成工作。这是一般规则。数据库优化器比遍历数组有更多的选择。数据库服务器通常比运行应用程序的节点更强大。 而且,与仅返回您想要的结果相比,传回所有数据可能(相对)昂贵。 (也就是说,也有异常(exception),但很少见。)
如果你想要名称对,那么你可以这样做:
select firstname, lastname, count(*) as cnt
from contacts
group by firstname, lastname
having cnt > 1;
如果您想要重复的原始行,那么我会推荐 exists
:
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
);
对于此查询,您需要一个关于contacts(lastname, firstname)
的索引。
关于php - 运行新的 SQL 查询 VS。循环遍历相似的数据集 - 什么更有效率?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49673598/