0

この理論が多​​くの状況に適用できる、複数選択リストをロードするより効率的な方法を探しています。私のやり方では多くのクエリが発生し、2 つの db クエリでそれを行う方法があるかどうか疑問に思っていました。

DB Table : users: fields= (userID, name)
       data: 1, Dan
       data: 2, Cory
       data: 3, Matt
DB Table : users_selected: fields(userSelectedID, userID)
       data: 1,1

今phpで私は通常次のことを行います:

<?php 
 $q = 'SELECT userID,name FROM users';
 $r = mysql_query($r);
 echo '<select id="assignToID" name="assignToID[]" multiple="assignToID">';
 while($e = mysql_fetch_array($r){
     //this is where you have to query the db each time... theres got to be a better way
     $q2 = 'SELECT userSelectedID FROM user_selected WHERE userID = "'.$e['userID'].'" ';
     $r2 = mysql_query($q2);
     $nr = mysql_num_rows($r2);
     if($nr>0){
        $sel = ' selected="selected" ';
     }
     else{
        $sel = '';
     }
     echo '<option '.$sel.' value="'.$e['userID'].'"'>'.$e['name'].'</option>';

 }
 echo '</select>'
?>

したがって、上記では、ループ内の DB にあるすべてのユーザーに対してクエリを実行する必要があります。PHP array_merge を使用するか、何らかの方法ですべてのユーザーに対して 1 つのクエリを実行し、選択されているかどうかを追加する方法はありますか... よりエレガントで効率的なソリューションを見つけようとしています。

どうもありがとう

4

1 に答える 1

1

はい、1 つの SQL クエリで必要なものを取得する方法があります。

SELECT * FROM users
LEFT OUTER JOIN user_selected
ON users.userID = user_selected.userID

この LEFT OUTER JOIN は、user_selected からの一致するレコード (利用可能な場合) を使用して、テーブル users からのレコードの完全なセットを生成する必要があります。一致しない場合、右側には null のみが含まれます。

于 2012-07-06T18:52:40.910 に答える