シナリオは、学生テーブルがあり、クラスが 4 つあり、部屋番号しか知らない場合です。また、テーブルが 2 つあり、1 つは教師の名前と部屋番号、もう 1 つは教師の名前と担当科目が記載されています。ここで、生徒は数学の先生が誰であるかを知りたいと考えています。生徒の名前と数学の先生の名前だけが必要です。
これは、私が取り組んでいるバウチャー プロジェクトの架空のシナリオです。多くの状況で動作するようになりましたが、非常に遅いです。新しい列を作成するためのケース条件では何も速度が低下することはありません。学生テーブルを教師テーブルに関連付ける列がわからないため、同じケース条件を使用してテーブルを結合したままにしました。左結合のケース条件が問題を引き起こしているようですが、遅延なく同じ結果を得るために使用できる他の方法はありますか?
P粉5144588632024-02-27 00:26:59
あなたがこれほど多くの問題を抱えているのは、あなたのアーキテクチャがあまり良くないからだと思います。具体的には、各コース/部屋番号の列がある学生テーブルのスキーマです。
私は最初にサブクエリを使用してこの問題を修正しました。例:
SELECT `学生名`、期間として 1、ルームとして `1st Room#` を学生から選択します すべてを結合する `学生名`、期間として 2、ルームとして `2nd Room#` を学生から選択します。 すべてを結合する `学生名`、期間として 3、部屋として `3rd Room#` を学生から選択します。 すべてを結合する `学生名`、期間として 4、部屋からの学生として `4th Room#`を選択します
このように「ピボットを解除」すると、きれいな Student Name | Period | Room
スキーマが得られ、この問題の解決がはるかに簡単になります。
SELECT `生徒名`、件名.`教師名` から ( `学生名`、期間として 1、部屋として `1st Room#` を学生から選択します すべてを結合する `学生名`、期間として 2、ルームとして `2nd Room#` を学生から選択します。 すべてを結合する `学生名`、期間として 3、部屋として `3rd Room#` を学生から選択します。 すべてを結合する `学生名`、期間として 4、部屋として `4th Room#` を学生から選択します。 ) 学生 INNER JOIN 教師ルーム ON students.Room = TeacherRoom.`部屋番号` INNER JOIN 教師件名 ON TeacherRoom.`教師名` = TeacherSubject.Subject WHERE TeacherSubject.Subject = '数学';