php - 运行新的 SQL 查询 VS。循环遍历相似的数据集 - 什么更有效率?

标签 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, 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/

相关文章:

php - Flash对象使MySQL增加2

php - Composite 模式比 Array 给我带来什么优势?

php - 我如何判断 mysql_real_escape_string 是否正常工作

mysql - 根据两个连接表结果从查询中排除记录

sql - 在 Oracle 中创建直方图/频率分布的最佳方法?

MySQL 使用函数更改的该行的值更新所有行

php - 最近 15 分钟

javascript - 修改脚本以折叠提交表单上的 div

php - 如何从 MySQL 数据库动态加载标记?

sql - 如何在 RDBMS 中表示预定事件?