2016-05-02 8 views
0

に一致する選択列は、私はこのような文字列である列parametersを持ってproductsと呼ばれます。すべてのIDは#で区切られています。いくつかのパラメータは=であり、このパラメータは特定の値(整数のみ)を持つことを意味します。MySQLの私のテーブルではパラメータ

ID 4のパラメータは値10です。

$_GET["parameters"]に保存されたパラメータに一致する製品を選択したいと考えています。保存されたパラメータのパターンは、例えば2-6-5>10-4<5です。パラメータ4には値10があり、これは5より大きいので、上記の文字列の例は一致しません。

私はパラメータIDでテーブルから製品を選択する方法を知っています。このように:

$parameters = explode("-", $_GET["parameters"]); 
$search = ""; 

foreach ($parameters as $parameter) { 
    if (preg_match("/^\d+$/", $parameter)) { 
     $search .= "AND parameters LIKE '%#$parameter#%' "; 
    } 
} 

$search = preg_replace("/^AND\s/", "", $search); 
$sql = "SELECT * FROM products WHERE $search"; 
... 

しかし、私はパラメータ5>104<5でこれを解決する方法を、知りません。私は、パラメータ2、6、5が10以上、4が5以下の製品を手に入れたいと思っています。これはMySQLでも可能ですか?はいの場合、どうですか?

+5

Ew ...もしあなたがこれを行うのが難しいと思っているのなら、おそらくそれはひどく間違っているからです。 –

+1

@NiettheDarkAbsolに加えて、すべての製品に** ID別の列**? – Jan

+1

'LIKE'は正規表現ではありません。それはより多くのグロブのようです。 – Laurel

答えて

0

LIKEは非常に遅い。同じフィールドで複数回実行するのは非常に効率的ではありません。どのようにクエリを素早く生成し、それをサポートするデータモデルを作成することができるかを考えてみましょう。何かのように

SELECT * FROM my_table 
    WHERE prop2 NOT NULL 
    AND prop6 NOT NULL 
    AND prop5 < 10 
    AND prop4 < 5 

読みやすく、維持しやすく、高速です。これは、各プロパティが独自の列にあることを意味します(プロパティのインデックス作成も可能です)。また、プロパティに読み込み可能な名前を使用するだけで、何時間ものデバッグ時間を節約できます。

関連する問題