1

私はある種のトリッキーな問題を抱えており、それを解決するためのより簡単な方法があるかどうかを確認したいと思います。

私は言いましょう

$numbers= $_GET['numbers']; //resulting in $numbers=array(1,2,3)
  • 配列のカウントは、$_GET値によって異なる場合があります...
  • これらは、 '%"。$number。"%'を使用して検索する必要があります。これは、行にコンマで区切られた複数の数値が含まれている可能性があるためです。

私の理想的な結果は、次のように$ numbers(1,2,3)の検索を実行することです。

SELECT * FROM database WHERE numbers LIKE('%1%' OR '%2%' OR '%2%')
4

6 に答える 6

2
$like_part = implode(' OR ', array_map(function($i) {
        return "(_utf8 '%{$i}%' USING latin1)";
    }, $numbers)
);
于 2012-05-21T03:33:14.240 に答える
2

foreachを使用してwhere文字列を作成し、それをクエリに追加します。

$query = '...';

$where = '';
foreach ($numbers as $number) {
    $where .= ...
}

$query .= $where;

テーブルを正規化し、準備されたクエリを使用する必要があることについては触れません。

于 2012-05-21T03:34:07.590 に答える
2

OR配列の要素ごとに多くの演算子を挿入する必要はありません。代わりに、rlike(MySQLの正規表現マッチャー演算子)を使用して、次のようにコードを大幅に簡略化できます。

$numbers = array(1,2,3);
$sql = 'SELECT * from `database` WHERE number rlike "^'.implode('|', $numbers).'$"';
// $sql becomes: SELECT * from `database` WHERE number rlike "^1|2|3$"
于 2012-05-21T04:22:26.093 に答える
2

このコード:

<?php
$numbers = array(1,2,3);
$sql = "SELECT * FROM table WHERE numbers LIKE ('%" . implode("%' OR '%", $numbers) . "%')";

このクエリの結果:

SELECT * FROM table WHERE numbers LIKE ('%1%' OR '%2%' OR '%3%')
于 2012-05-21T04:28:20.620 に答える
1

の効果に:

$ query = "select * from tablewhere condition like('text before'" .implode( "'text after text before'"、$ array)。 "'text after')"

$ query = "select * from tablewhere number like(\" _ utf8'% ".implode("%' using latin1 \ "、$ _GET ['numbers'])。"%'using latin1 OR _utf8'%\ ")

[implodeが針/干し草の山かその逆かわからない]

于 2012-05-21T03:32:09.687 に答える
0
1 - SELECT * FROM b AS B INNER JOIN a AS A ON A.a=B.a WHERE A.a RLIKE '^1-|^2-|^3'
2 - SELECT * FROM b AS B INNER JOIN a AS A ON A.a=B.a WHERE (A.a LIKE '1-%' OR A.a LIKE '2-%' OR A.a LIKE '3-%')

最初のクエリは回りました

  1. メモリ使用量=時間がかかっています
  2. 実行時間=時間がかかります
  3. PHPMYADMIN行0〜24を表示(合計138、クエリに1.1243秒かかりました)-直接のPHPスクリプトよりも非常に少ないデータでテストされました

2番目のクエリは回りました

  1. メモリ使用量=1198.0807113647MB
  2. 実行時間=30.719851970673秒
  3. PHPMYADMIN-0〜24行を表示(合計138、クエリに0.0018秒かかりました)-直接PHPスクリプトを使用した場合よりも非常に少ないデータでテストされました

Foreachが回りました

  1. メモリ使用量=972.3137588501MB
  2. 実行時間=10.898797988892秒

構成

  1. 32GB RAM
  2. IntelI9-第10世代CPU@2.81GHz
  3. PHP 7.3
  4. MYSQL-5.7.31
  5. テーブルサイズ-SQLプロシージャによって生成された200万のデータ
  6. 'have_query_cache'のような変数を表示します。// はい
  7. フェッチされたデータサイズ275093
  8. インデックス作成-利用可能
  9. LIKE演算子4739の変数の数(i.e. 1,2,3... in RLIKE '^1-|^2-|^3....etc')
  10. php関数によって計算されたメモリ使用量memory_get_usage();

反対意見を歓迎します。

于 2021-07-18T13:26:46.853 に答える