Php SQL尝试使用LIKE为字段返回行

Php SQL尝试使用LIKE为字段返回行,php,sql,database,mysqli,Php,Sql,Database,Mysqli,我有一个db I查询来选择列devicetoken并返回所有类似于字符串的行,我有一个数组。查询在数组中的每个值的循环中进行。SQL语法不是我想要的。我没有使用通配符,因为我不希望它返回我要查找的字符串的子字符串 下面是SQL语法: $result = $mysqli->query("SELECT devicetoken FROM `department devices` WHERE unit LIKE $unitsarray[$i]"); 用于我的测试的单元阵列包括: --- Unit

我有一个db I查询来选择列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
<?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.
?>

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

您在数据库设计上有什么灵活性吗?规范化理论认为应该将这些值存储在一个单独的表中(如果您不熟悉这一点,可以找到一个示例)。否则,您将面临每行文本搜索问题,这可能会随着表的增长而严重影响性能

现在,如果您使用这种设计,您可以在每行有固定数量的项目的情况下扩展查询。例如,显示了一种可能的解决方案:

WHERE
      MyColumn LIKE '%,' + @search + ',%' --middle
      OR
      MyColumn LIKE @search + ',%' --start
      OR
      MyColumn LIKE '%,' + @search --end
      OR 
      MyColumn =  @search --single

试着这样做:

device_id    devicetoken                                           unit
T05 ipad     773f5436825a7115417d3d1e036da20e806efeef547b7c3fe4    E17, E03, E05
E05 ipad     773f5436825a7115417d3d1e036da20e806efeef547b7c3fe4    E01, E62, E67
<?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.
?>

是的,我有一种感觉。我开始改变设计,因为我认为这是一个糟糕的设计方法。谢谢你的澄清!你真的应该规范化你的数据库。