Php SQL尝试使用LIKE为字段返回行
我有一个db I查询来选择列devicetoken并返回所有类似于字符串的行,我有一个数组。查询在数组中的每个值的循环中进行。SQL语法不是我想要的。我没有使用通配符,因为我不希望它返回我要查找的字符串的子字符串 下面是SQL语法: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
$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.
?>
是的,我有一种感觉。我开始改变设计,因为我认为这是一个糟糕的设计方法。谢谢你的澄清!你真的应该规范化你的数据库。