如何避免在选择基于两个数组数据的查询时出现循环

bnl4lu3b  于 2021-06-20  发布在  Mysql
关注(0)|答案(2)|浏览(383)

我有一张像下面这样的table。

id  supplier_id item_id minimum_order_qty   
1      6           1         500 
2      4           1         300 
3      2           2         200 
4      3           2         100 
5      4           3         250 
6      5           5         100 
7      7           6         1000    
8      8           6         600 
9      9           7         700 
10     1           7         500 
11     7           8         1000    
12     9           9         700 
13     2           10        500 
14     9           10        600

每个 item_id 可以有多个供应商( supplier_id ).
我有两个数组 item_id 数组和 supplier_id 数组。 item_id 数组:

Array
    (
        [0] => 9
        [1] => 10
        [2] => 11
        [3] => 12
        [4] => 13
        [5] => 14
        [6] => 15
        [7] => 16
        [8] => 17
        [9] => 18
        [10] => 19
        [11] => 20
        [12] => 21
        [13] => 22
        [14] => 23
        [15] => 24
    )
``` `supplier_id` 数组:

Array
(
[0] => 9
[1] => 2
[2] => 5
[3] => 1
[4] => 1
[5] => 9
[6] => 6
[7] => 4
[8] => 6
[9] => 9
[10] => 1
[11] => 9
[12] => 9
[13] => 4
[14] => 5
[15] => 9
)

两个数组长度相同。我要选择 `minimum_order_qty` 从 `supplier_item` 基于这两个数组。通常,我必须选择这样的内部循环:

$item_count = count($item);
$sup_count = count($supp_id);
for($i=0; $i<$item_count; $i++) {
$itm_id = $item[$i];
$s_id = $supp_id[$i];
$sql = "select * from supplier_item where item_id=$itm_id and supplier_id=$s_id";
$result[] = $this->query($sql);
}

但是,上面的代码将多次运行查询。我不想这么做。那么,有没有其他方法可以通过单个查询选择数据呢?
7bsow1i6

7bsow1i61#

您可以在一个查询中完成

$item_count = count($item);
$sup_count = count($supp_id);
$predicates = [];
for($i=0; $i<$item_count; $i++) {
    $itm_id = $item[$i];
    $s_id = $supp_id[$i];
    $predicates[] = "(item_id=$itm_id and supplier_id=$s_id)";
}
$sql = "select * from supplier_item where " . implode(' OR ', $predicates);
$result = $this->query($sql);
hgtggwj0

hgtggwj02#

我们可以利用mysql的扩展 WHERE IN 语法,并使用以下形式的查询:

SELECT *
FROM supplier_item
WHERE (item_id, supplier_id) IN ((9, 9), (10, 2), ...);

php代码:

$item_id = array(9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24);
$supplier_id = array(9,2,5,1,1,9,6,4,6,9,1,9,9,4,5,9);

$where = "(";
for ($i=0; $i < count($item_id); $i++) {
    if ($i > 0) $where .= ", ";
    $where .= "(" . $item_id[$i] . ", " . $supplier_id[$i] . ")";
}
$where .= ")";

$sql = "SELECT * FROM supplier_item WHERE (item_id, supplier_id) IN " . $where . ';';

重要提示:原始字符串连接可能会为sql注入打开大门。如果在生产中使用此答案,则仅当您已经对item和supplier id数组进行了消毒,并且确定它们只包含整数时,才应使用此答案。

相关问题