2009-07-03 13 views
1

私は本当にファンキーなコードを持っています。下のコードからわかるように、私はクエリに追加する一連のフィルタを持っています。今では複数のクエリを持つ方が簡単ですが、それは独自のフィルタセットを使用して結果を配列に格納するか、この混乱を招くでしょうか?PHP:複数のSQLクエリと1つのモンスター

誰もがこの混乱に良い解決策を持っていますか?私はキーワードと項目番号でフィルタリングできる必要があり、複数の値を使ってフィルタリングする必要があります。

//Prepare filters and values 
$values = array(); 
$filters = array(); 
foreach($item_list as $item){ 
    $filters[] = "ItemNmbr = ?"; 
    $filters[] = "ItemDesc LIKE ?"; 
    $filters[] = "NoteText LIKE ?"; 
    $values[] = $item; 
    $values[] = '%' . $item . '%'; 
    $values[] = '%' . $item . '%'; 
} 
//Prepare the query 
$sql = sprintf(
    "SELECT ItemNmbr, ItemDesc, NoteText, Iden, BaseUOM FROM ItemMaster WHERE %s LIMIT 21", 
    implode(" OR ", $filters) 
); 
//Set up the types 
$types = str_repeat("s", count($filters)); 
array_unshift($values, $types); 

//Execute it 
$state = $mysqli->stmt_init(); 
$state->prepare($sql) or die ("Could not prepare statement:" . $mysqli->error); 
call_user_func_array(array($state, "bind_param"), $values); 
$state->bind_result($ItemNmbr, $ItemDesc, $NoteText, $Iden, $BaseUOM); 
$state->execute() or die ("Could not execute statement"); 
$state->store_result(); 

答えて

2

質問には特に怪しいものはありません。 私が違うしかないのは、検索用語を分けることだけです。

ee $ item_listは数値項目とテキスト項目に分割できます。

...WHERE ItemNmbr IN (number1, number2, number3) OR LIKE .... $text_items go here.... 

INが多く、より効率的であり、あなたの$はitem_listは、任意のテキスト部分が含まれていない場合は...その後、あなただけの数字の束を検索している:

は、次のような検索何かを作ることができますそれは本当に速いです。

今度は、MySQL Full-text Searchingを使用することをお勧めします。

+0

また、MATCH .. AGAINSTを使ってアイテム番号で検索することもできますか?残念なことに、アイテム番号はあまりにも理由があるいくつかのためだけの数字ではないので... – MackDaddy

2

正確に必要なものによって答えが異なります。 1つのクエリのみを使用する利点は、リソース使用のクエリです。 1つのクエリは、SQL Serverとの接続と通信が1つだけです。まさにあなたがしようとしていることに依存して、1つの文で複数の文よりも少ないSQL処理能力を必要とするかもしれません。

ただし、プログラマの観点から見ると、1つの大きな文を作成する必要がない複雑なSQL文を使用するほうが現実的です。究極的には、これをプログラミングしており、それを機能させる必要があることを覚えておいてください。スクリプト処理とSQL処理の違いは実際には違いはないかもしれません。あなただけが最終的な電話をすることができます。これはもっと重要ですか?大きなデータベースを扱うときは、スクリプト処理よりもSQL処理をお勧めします。

1

単一のテーブルクエリは、SQLエンジンによってキャッシュできます。 MySQLとそのilkは結合されたテーブルをキャッシュしません。パフォーマンスの一般的なルールは、必要な場合にのみ結合を使用することです。これにより、DBエンジンはテーブルインデックスを積極的にキャッシュすることができます。また、Amazon/Googleクラウドサービスのような(より速く)オブジェクトデータベースにコードを簡単に適応させることができます。

関連する問題