Maison > Questions et réponses > le corps du texte
Le scénario est le suivant : j'ai une table d'étudiants et ils ont 4 classes et ils ne connaissent que le numéro de la chambre. Il y a également deux tableaux, l'un avec le nom du professeur et le numéro de chambre, l'autre avec le nom du professeur et les matières qu'il enseigne. Maintenant, les élèves veulent savoir qui est leur professeur de mathématiques, ils veulent juste le nom de l'élève et celui du professeur de mathématiques.
Il s'agit d'un scénario fictif pour un projet de bons d'achat sur lequel je travaille. Je l'ai fait fonctionner dans de nombreuses situations, mais c'est très lent. La condition de cas pour créer la nouvelle colonne ne ralentit rien et j'ai laissé joindre les tables en utilisant la même condition de cas puisque nous ne savons pas quelle colonne relier la table des étudiants à la table des enseignants. La condition de cas dans la jointure de gauche semble être à l'origine du problème. Existe-t-il une autre méthode que je peux utiliser pour obtenir le même résultat sans délai ?
P粉5144588632024-02-27 00:26:59
Je pense que la raison pour laquelle vous rencontrez tant de problèmes est que votre architecture n'est pas très bonne. Plus précisément le schéma de la table des étudiants où il y a une colonne pour chaque numéro de cours/salle.
J'ai d'abord corrigé cela à l'aide d'une sous-requête, par exemple :
SELECT `Student Name`, 1 as Period, `1st Room#` as Room FROM students UNION ALL SELECT `Student Name`, 2 as Period, `2nd Room#` as Room FROM students UNION ALL SELECT `Student Name`, 3 as Period, `3rd Room#` as Room FROM students UNION ALL SELECT `Student Name`, 4 as Period, `4th Room#` as Room FROM students
"Unpivoting" comme celui-ci vous donnera une belle architecture propre Student Name |期间 | Room
qui facilitera la résolution de ce problème.
SELECT `Student Name`, Subject.`Teacher Name` FROM ( SELECT `Student Name`, 1 as Period, `1st Room#` as Room FROM students UNION ALL SELECT `Student Name`, 2 as Period, `2nd Room#` as Room FROM students UNION ALL SELECT `Student Name`, 3 as Period, `3rd Room#` as Room FROM students UNION ALL SELECT `Student Name`, 4 as Period, `4th Room#` as Room FROM students ) students INNER JOIN teacherRoom ON students.Room = teacherRoom.`Room Number` INNER JOIN teacherSubject ON teacherRoom.`Teacher Name` = teacherSubject.Subject WHERE teacherSubject.Subject = 'Math';