0

列 devicetoken を選択し、配列を持つ文字列のようなすべての行を返すようにクエリするデータベースがあります。クエリは、配列内の値ごとにループで発生します。SQL 構文は、私が望むことをしていません。探している文字列の部分文字列を返したくないので、ワイルドカードを使用していません。

SQL 構文は次のとおりです。

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

テスト用の units 配列は次のもので構成されています。

--- 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

そのため、ループ内のイベントは 3 回呼び出される必要があります。1 回は通過して E17 が見つかったとき、1 回は E03 の場合、1 回は E05 の場合です。では、ループを循環するたびにこれらの文字列を取得するように LIKE を設定するにはどうすればよいでしょうか。

4

2 に答える 2

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 に答える
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 に答える