我有两个相互依赖的MySql查询 我的表'
----------
id
----------
1
2
3
4
5
6
7
我的第一个查询
$sql1 = "SELECT * FROM table1 WHERE";// some condition which gives me id's 1,2,3
$res1=$obj->_executeQuery($sql1);
$res1=$obj->getAll($res1);
结果是给我数组
Array
(
[0] => Array
(
[id] => 1
..
..
)
[1] => Array
(
[id] => 2
..
..
)
[2] => Array
(
[id] => 3
..
..
)
)
我想在同一个' table1'上运行另一个查询,其中不等于我从第一个查询中获取的ID列表。
我的第二个查询
$sql2 = "SELECT * FROM table1 WHERE id NOT IN (" . implode(',', $res1) . ")";
这首先没有向我展示一个id i。在上面的例子中,我应该得到id 4,5,6,7
答案 0 :(得分:1)
自implode will not give
desired value
以multidimensional array
开始,所以首先需要获取所有id's
的数组以形成one-dimensional array
,然后在数组上使用implode id's
:
$id=array();
foreach ($res1 as $key=>$inner_array){
$id[]= $inner_array['id'];
}
你也可以在这里使用array_walk
:
array_walk($res1,function($c) use (&$id) {$id[] = $c['id'];});
但我认为最好的是array_map
:
$id = array_map(function($i) {
return $i['id'];
}, $res1);
$sql2 = "SELECT * FROM table1 WHERE id NOT IN (" . implode(',', $id) . ")";
注意:当你选择时,请指定你的专栏,如果你需要很少选择,不必要地选择所有将减慢你的sql处理。
这里假设:SELECT * FROM table1 WHERE
,如果您只需要ID,请选择ID。
答案 1 :(得分:0)
您必须将$res1
(一个二维数组)更改为一维ID数组才能使用implode
:
$ids_from_first_query = array();
foreach($res1 as $result_row) {
$ids_from_first_query[] = $result_row['id'];
}
$ids_as_string = implode(',', $ids_from_first_query);
$sql2 = 'SELECT * FROM table1 WHERE id NOT IN(' . $ids_as_string . ')';
在上面的代码中,$ids_as_string
将如下所示:
1,2,3
因此可以在MySQL查询中使用
答案 2 :(得分:0)
这里你得到的是二维数组,这是因为它无法正常工作
while($each=mysql_fetch_array($res1))
{
$array[]=$each[id];
}
$imp=implode(",",$array);
$sql2 = "SELECT * FROM table1 WHERE id NOT IN (".$imp.")";
试试这个会起作用