0

我有一个数据库,我查询以选择列 devicetoken 并返回所有类似于字符串的行我有一个数组。查询在数组中的每个值的循环中发生。SQL 语法没有做我想要的。我没有使用通配符,因为我不希望它返回我正在寻找的字符串的子字符串。

这里的 SQL 语法:

$result = $mysqli->query("SELECT devicetoken FROM `department devices` WHERE unit LIKE $unitsarray[$i]");

我的测试的单位数组包括:

--- Units row 0 = 121
--- Units row 1 = 125 
--- Units row 2 = BR171 
--- Units row 3 = C1 
--- Units row 4 = C120 
--- Units row 5 = D2INV 
--- Units row 6 = E03 
--- Units row 7 = E05 
--- Units row 8 = E17 
--- Units row 9 = E173 
--- Units row 10 = HFPIO 
--- Units row 11 = MW70 
--- Units row 12 = T05 
--- Units row 13 = TIMERW 
--- Units row 14 = WT01 
--- Units row 15 = WT13 
--- Units row 16 = WT17 

我的数据库看起来像这样:

device_id    devicetoken                                           unit
T05 ipad     773f5436825a7115417d3d1e036da20e806efeef547b7c3fe4    E17, E03, E05
E05 ipad     773f5436825a7115417d3d1e036da20e806efeef547b7c3fe4    E01, E62, E67

所以,我在循环中的事件应该被调用三次,一次是当它通过并找到 E17 时,一次是为了 E03,一次是为了 E05。那么如何设置 LIKE 以在每次循环循环时获取这些字符串。

4

2 回答 2

0

您对数据库设计有任何灵活性吗?规范化理论说你应该将这些值存储在一个单独的表中(如果你不熟悉这个,你可以在这里找到一个例子)。否则,您将面临每行的文本搜索问题,这可能会随着表的增长而显着降低性能。

现在,如果您有这种设计的库存,则可以扩展您的查询,以防每行有固定数量的项目。例如,这个问题显示了一个可能的解决方案:

WHERE
      MyColumn LIKE '%,' + @search + ',%' --middle
      OR
      MyColumn LIKE @search + ',%' --start
      OR
      MyColumn LIKE '%,' + @search --end
      OR 
      MyColumn =  @search --single
于 2012-12-17T02:21:44.927 回答
0

尝试这样的事情:

<?php
    $query = "SELECT `devicetoken` FROM `department devices` WHERE unit LIKE ";
    for($1 =0; $i<count($unitsarray); $i++)
        if(count($unitsarray)-1 < $i)
            $query .= "%" . $unitsarray[$i]; ."% OR ";
        else
            $query .= "%" . $unitsarray[$i] . "%";

    $result = $mysqli->query($query);

   // Do something with the result. This'll give you 1 query
   // To fetch all rows at once. while($row = $result->fetch_assoc())
   // foreach($row as $value) etc.
?>
于 2012-12-17T09:10:04.697 回答