1

バックグラウンド

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クエリはありますか???

4

1 に答える 1

1

ソリューションでは、2つのステップを使用して、必要に応じてデータをフィルタリングできるようにします。レポートを生成しているので、これは、あなたが望むよりも少し冗長に見えても、かなり良いアプローチです。

このアプローチの利点は、デバッグと保守がはるかに簡単であるという大きな利点です。

状況を改善するには、データ構造自体を考慮する必要があります。表を見るclass_choicesと、次のフィールドが表示されます。これらのフィールドkf_classID, preference, assignedには重要な情報が含まれています。

各クラスのassignedフィールドは、0(デフォルト)または1(クラス設定が生徒に割り当てられている場合)のいずれかです。デフォルトでは、特定のセクターのすべての学生のクラス選択に対してpreference = 1レポートに表示するため、クラスは割り当てられています。assigned=0

データモデルは、次のようにビジネスルールを課すことで改善できます。デフォルト値を設定する
場合。クラス選択プロセスが行われ、生徒に2番目または3番目の選択肢が割り当てられた場合、優先度1は割り当てられず、代替選択肢が割り当てられます。preference=1assigned=1

これは、アプリケーションのコードが少し増えることを意味しますが、レポート作成が少し簡単になります。

困難の原因は、割り当てプロセスが最初の優先順位を明示的に割り当てないことです。assigned生徒が最初の選択肢を取得できない場合にのみ更新されます。

要約すると、SQLは優れており、データモデルをもう一度見直すことで改善がもたらされます。

これがお役に立てば幸いです。

于 2013-03-13T11:18:23.903 に答える