php - 如何使用mysql数据库数据在 array 上删除上的项目

  显示原文与译文双语对照的内容
0 0

我想做这样的事情


----sql output-----
名称文本
b
c


$arr = ["a","b","c","d"];
foreach($arr as $key=>$val){
 $query ="select count(*) from mydata where name = $val";
 $count = xxxx($query);
 if($count)unset($arr[$key]);
}

还有 $arr
A,D

任何简单的方法,但不检查每个元素?


---EDITED----
我想我自己解决了自己的问题。"。"。从mrlore获得一些使用 Having的灵感。

$arr = ["a","b","c","d"];/* make the string inside arr safe for query */
$val = array_map(function($val){return"'$val'";},$arr);
$q ="select name from mydata where name in (". implode(',',$val).")";
$all = xxxxx($q);
$arr = array_diff($arr,$all);

这花费了我 0.8秒。 使用旧方法采用 46秒,RST方式采用 2秒。


---edited-----
我的数据库中有超过 200k 行数据,所以我想要一个更好的方法来优化它。


--re MrLore---
ps: 我不知道如何使用stackoverflow发表评论。so所以我只编辑我的帖子。

我在 MySQL Workbench 上尝试过它,但它似乎不适合我。

select name from mydata 
where name in("a","b","c","d") 
having count(name) = 0 

--不返回任何内容

select name from mydata 
where name in("a","b","c","d") 
having count(name)> 0 
时间:原作者:4个回答

0 0
$arr = ["a","b","c","d"];
 $query ="select DISTINCT name from mydata";
 $results = <result of query>;
 foreach ($results as $result){
 if(($key = array_search($result, $arr))!== false) {
 unset($arr[$key]);
 }
 }

或者另一条路

 foreach ($arr as $key=>$value){
 if( in_array( $value, $results) ) {
 unset($arr[$key]);
 }
 }

通过查询 DISTINCT,数据库只返回惟一值。 然后,你可以将它们与你拥有的array 进行比较并删除它们。

原作者:
...