バックグラウンド
3つのテーブルに関連して、次の問題に直面しています
class_sectors
テーブルには、クラスの 3 つのカテゴリが含まれています
classes
テーブルには、学生が参加できるクラスのリストが含まれています
class_choices
セクターごとに、学生の第 1、第 2、第 3 クラスの選択が含まれています。たとえば、セクター 1 の場合、Student_A は第 1 の選択肢として class_1、第 2 の選択肢として class_3、第 3 の選択肢として class_10 を持ち、セクター 2 の場合、彼には別の 3 つの選択肢があります。
class_choices
テーブルには次の列があります。
kp_choice_id | kf_personID | kf_sectorID | kf_classID | preference | assigned
列名は一目瞭然だと思います。preference
は 1、2、または 3 のいずれかです。assigned
生徒の選択を確認してクラスに割り当てると、1 に設定されるブール値です。
問題:
各セクターのどのクラスに割り当てられているかを学生に伝える SQL クエリを作成します。クラスが割り当てられていない場合は、デフォルトで最初の優先順位が表示されます。
私は実際にこれを機能させましたが、次のように2つの(非常に肥大化した??)SQLクエリを使用しています。
$choices = $db -> Q("SELECT
*, concat_ws(':', `kf_personID`, `kf_sectorID`) AS `concatids`
FROM
`class_choices`
WHERE
(`assigned` = '1')
GROUP BY
`concatids`
ORDER BY
`kf_personIDID` ASC,
`kf_sectorID` ASC;");
$choices2 = $db -> Q("SELECT
*, concat_ws(':', `kf_personID`, `kf_sectorID`) AS `concatids`
FROM
`class_choices`
WHERE
`preference` = '1'
GROUP BY
`concatids`
HAVING
`concatids` NOT IN (".iimplode($choices).")
ORDER BY
`kf_personID` ASC,
`kf_sectorID` ASC;");
if(is_array($choices2)){
$choices = array_merge($choices,$choices2);
}
今$choices
、私が欲しいものを持っています。
しかし、これを単純化し、2 つの SQL クエリをマージする方法があると確信しているため、もう少し軽量になります。
これを行うことができる条件付きSQLクエリはありますか???