0

MySQL データベースの列からワイルドカードで選択した結果に基づいてリストを作成しようとしています。私はそれを行うことができますが、非常に遅く、おそらく間違った方法のようです。これが私が今いじっているコードです

$optarr = array("leather", "cruise", "tint", "sunroof", "moonroof", "navigation", "antilock");
 foreach ($optarr as $i) {
    $refquery = "SELECT stock, COUNT(stock) FROM vehicle_list AND options LIKE '%$i%'"; 
    $refresult = mysql_query($refquery) or die(mysql_error());
    $row = mysql_fetch_array($refresult);

    if ($row['COUNT(stock)'] != '0') {
    echo "".ucfirst($i)." (".$row['COUNT(stock)'].")<br />";
    }
}

これにより、次のように出力されます

Leather(234)
Cruise(343)
Tint(231)
Sunroof(343)
.....

このリストは最終的に約 20 ~ 30 の異なるフィルター オプションになりますが、現在 4 ~ 5 の場合、かなりの遅延が見られます。私は何か間違ったことをしている、ただ何がわからない. 多分アプローチ全体?

データベースのオプション列は、@ 記号で区切られたテキスト ブロック全体であるため、Like ワイルドカードを使用して車両オプションを抽出しています。

ありがとう!

4

5 に答える 5

0

に存在するたびに新しいクエリを発行しているようです$optarr

最初に条件のリストを作成してから、単一のクエリを起動できます

何かのようなもの

$optarr = array("leather", "cruise", "tint", "sunroof", "moonroof", "navigation", "antilock");
 $strCondition = NULL;
 foreach ($optarr as $i) {
    $strCondition .= ( true == is_null(strCondition ) )? "LIKE '%$i%'" : "OR LIKE '%$i%'"; 
}

if( false != $strCondition ) {
    $refresult = mysql_query( 'SELECT stock, COUNT(stock) FROM vehicle_list AND options ' . $strCondition ) or die(mysql_error());
     while( $row = mysql_fetch_array($refresult) )
     {
         if ($row['COUNT(stock)'] != '0') {
         echo "".ucfirst($i)." (".$row['COUNT(stock)'].")<br />";
     }
}

私はそれをテストしていないので、いくつかあるかもしれsyntax errorsません:p.

上記の方法はperformance gain、一般に、値を取得したい方法でテーブル内に値を格納する必要があります(「革」、「クルーズ」などの値のみを新しい列条件に追加することをお勧めします..)

于 2013-04-02T17:31:06.183 に答える
0

テーブルに関連するテーブルにあるように、おそらくオプションを正規化する必要がありvehicle_listます。これにより、今後の生活がずっと楽になります。

vehicle_optionsこのようなテーブルがあったとしましょう

vehicle_option_id -> primary_key, autoincrement
vehicle_id -> foreign key to vehicle_list table
option -> text string describing option

3 つのフィールドすべてにインデックスが必要です。

その後、このテーブルに対する単一のクエリからカウントを取得できます。この場合、 vehicle_list をクエリする必要さえありません。

SELECT option, COUNT (vehicle_option_id) AS `option_count` FROM
vehicle_options
GROUP BY option

さらに正規化するには、使用可能なオプションの説明を実際に含むさらに別のテーブル オプションを用意し、そのvehicle_optionsテーブルを単純に多対多結合テーブルとして機能させることを検討することもできます。このスキーマを使用すると、テーブルは次のようになります。

vehicle_options

vehicle_id -> foreign key to vehicle_list table
option_id -> foreign key to option table

両方のフィールドに主キーがあります

options

option_id -> primary_key, autoincrement
option -> text string describing option

グループ化/ソートの目的で使用する場合は、オプションのインデックスが必要です

クエリは次のようになります。

SELECT o.option AS `option`, COUNT (vo.option_id) AS `option_count`
FROM vehicle_options AS vo
INNER JOIN options AS o
GROUP BY `option`
于 2013-04-02T17:33:58.213 に答える