2016-07-27 4 views
-1

データベースが2つのフィールド(Roll noおよびname)を持っていて、対応する名前を検索するロール番号のリスト(n個の値)があります。1つのクエリで複数の値を検索する

これはSQLまたはHQLの1つのクエリを使用して実行できますか?

+0

はいできます。 'IN'演算子について読む – Jens

+0

リストのサイズが動的である場合、IN演算子はどのように使用できますか? –

+0

あなたはあなたの質問を呼んでいますか? – Jens

答えて

0
SELECT name FROM [table] WHERE id IN ([list of ids]) 

ここで、[list of ids]は、例えば、2,3,5,7です。

+0

リストは可変です...リストのサイズと値はあらかじめ定義されていません。 –

+0

リストは可変であってもよい。クエリは決して可変ではありません。クエリはクエリです。おそらく、クエリを作成する場所のコードを表示する必要があります。 – Jakumi

0

IN演算子を使用し、Roll noをコンマで区切ります。

SELECT name 
FROM yourtable 
WHERE [Roll no] IN (1, 2, 3, 4, etc) 
0

上記のようにIN文を使用できます。

これにはいくつかの小さな問題があります。この節の値の数が大きすぎると、パフォーマンスが低下する可能性があります。

第2の問題は、多くの開発環境では、項目数が可変であるクエリを動的に作成する必要があることです(パラメータ化クエリを使用する場合は、プレースホルダの数が可変です)。あなたのコードが厄介に見える場合は難しくありませんが、あなたがコピーしてテストに使用できるすばらしい素敵なSQLを持っていないことを意味します。

しかし、例(phpを使用)。

ここで、INはSQLで動的に作成されます。ロール番号は整数だけであると仮定すると、配列内の各メンバにintval()を適用して、SQLで非整数値が使用されないようにします。

<?php 

$list_of_roll_no = array(1,2,3,4,5,6,7,8,9); 

$sql = "SELECT FROM some_table WHERE `Roll no` IN (".implode(", ", array_map ('intval', $list_of_roll_no)).")"; 

?> 

mysqliバインドされたパラメータを使用するのはちょっと面倒です。これは、バインド・パラメータ・ステートメントが可変数のパラメータを必要とするためです。 2番目のパラメータは、バインドされる値であり、参照渡しされることを期待しています。だからここのforeachは、参照の配列を生成するために使用される: -

<?php 

$list_of_roll_no = array(1,2,3,4,5,6,7,8,9); 

if ($stmt = $mysqli->prepare("SELECT FROM some_table WHERE `Roll no` IN (".implode(",", array_fill(0, count($list_of_roll_no), '?')).")")) 
{ 

    $bind_arguments = []; 
    $bind_arguments[] = str_repeat("i", count($list_of_roll_no)); 
    foreach ($list_of_roll_no as $list_of_roll_no_key => $list_of_roll_no_value) 
    { 
     $bind_arguments[] = & $list_of_roll_no[$list_of_roll_no_key]; # bind to array ref, not to the temporary $recordvalue 
    } 

    call_user_func_array(array($statement, 'bind_param'), $bind_arguments); 
    $statement->execute(); 
} 

?> 

別の解決策は、別のテーブルにすべての値をプッシュすることです。一時テーブルにすることができます。次に、テーブルと一時テーブルの間でINNER JOINを使用して、一致する値を検索します。あなたがすでに持っているものに応じて、これは非常に簡単です(たとえば、複数のレコードを簡単に挿入するPHPクラスがあります。クラスを渡し続け、クラスをバッチアップして時折挿入しますデータベース)。

関連する問題