Maison > Article > base de données > Voici quelques titres basés sur des questions qui correspondent à votre article fourni : * Comment fusionner les sujets étudiants en un seul enregistrement avec un LEFT JOIN et des sous-requêtes ? * Création d'une structure de données étudiantes unifiée avec
Dans la question précédente, je demandais comment fusionner toutes les matières de tous les semestres dans un seul enregistrement afin que chaque étudiant doive avoir une seule réponse et ses données ressembleront à cet exemple :
<code class="json">[ { "userid": "1", - from users table "username": "joe", - from users table "subjectsid": "1", - first subject id for the student in this case the one for phy "subjectname": "bio", - current subject name "activepts": "652", - points of current month "totalpts": "717", - total points of all subjects for this student "sem1": "32", - total points of all subjects for this student of semester 1 "sem2": "0", - total points of all subjects for this student of semester 2 "sem3": "685", - total points of all subjects for this student of semester 3 } ]</code>
J'ai donc eu une et une seule réponse mais la réponse ne m'a pas dit comment le faire, m'a juste dit la raison pour laquelle je dois utiliser LEFT JOIN et expliquez-moi ce que LEFT JOIN fera dans mon cas, je vais donc vous expliquer à nouveau ce que je dois faire puis j'expliquerai comment faire cela par code et quelques exemples :
1- Chaque élève aura une réponse
2- Chaque réponse contient tous ses sujets, chaque sujet sera une ligne
3- La première ligne contiendra quelques données statiques pour l'élève :
4- Le reste des lignes est le même comme ce qui me vient de la DB et pas besoin de changer quelque chose sauf filtrer les sujets pour qu'ils soient uniquement pour cet utilisateur
<code class="php">$sql = 'SELECT subjects.userid, users.name AS username, ( SELECT id FROM tbsubjects WHERE userid = subjects.userid ORDER BY id ASC LIMIT 1 ) AS subjectsid, ( SELECT name FROM tbsubjects WHERE userid = subjects.userid ORDER BY time DESC LIMIT 1 ) AS subjectname, ( SELECT IFNULL(SUM(points), 0) FROM tbsubjects WHERE userid = subjects.userid AND month = DATE_FORMAT(NOW(), "%c") ) AS activepts, IFNULL(SUM(subjects.points), 0) AS totalpts, ( SELECT IFNULL(SUM(points), 0) FROM tbsubjects WHERE userid = subjects.userid AND semester = 1 ) AS sem1, ( SELECT IFNULL(SUM(points), 0) FROM tbsubjects WHERE userid = subjects.userid AND semester = 2 ) AS sem2, ( SELECT IFNULL(SUM(points), 0) FROM tbsubjects WHERE userid = subjects.userid AND semester = 3 ) AS sem3 FROM tbsubjects AS subjects LEFT JOIN tbusers AS users ON users.id = subjects.userid WHERE subjects.userid = :userid'; $bindings = array( ':userid' => $userID, ); $users = $statement->fetchAll(PDO::FETCH_OBJ);</code>
Expliquez le code :
1- Les champs dans l'instruction SELECT, comme vous pouvez le voir, ils sont divisés en 2 groupes, le premier en haut est constitué de champs statiques pour l'étudiant, le reste obtiendra les valeurs de la table tbsubjects
2- La fonction LEFT JOIN est chargée d'obtenir all (userid) de la table tbsubjects et fusionnez-les par la clé commune entre eux userid, ce qui signifie que maintenant chaque utilisateur sera représenté par au moins une ligne contenant son premier sujet ( ORDER BY id ASC ) puis tous ses autres sujets, mais ils ont déjà fusionné dans une ligne seront répétés dans le reste des lignes comme les champs statiques de l'étudiant
<code class="json">[ { "userid": "1", - from users table "username": "joe", - from users table "subjectsid": "1", - first subject id for the student in this case the one for phy "subjectname": "bio", - current subject name "activepts": "652", - points of current month "totalpts": "717", - total points of all subjects for this student "sem1": "32", - total points of all subjects for this student of semester 1 "sem2": "0", - total points of all subjects for this student of semester 2 "sem3": "685", - total points of all subjects for this student of semester 3 }, { "userid": "1", - from users table "username": "joe", - from users table "subjectsid": "1", - first subject id for the student in this case the one for phy "subjectname": "phy", - current subject name "activepts": "10", - points of current month "totalpts": "717", - total points of all subjects for this student "sem1": "32", - total points of all subjects for this student of semester 1 "sem2": "0", - total points of all subjects for this student of semester 2 "sem3": "685", - total points of all subjects for this student of semester 3 }, { "userid": "1", - from users table "username": "joe", - from users table "subjectsid": "1", - first subject id for the student in this case the one for phy "subjectname": "math", - current subject name "activepts": "33", - points of current month "totalpts": "717", - total points of all subjects for this student "sem1": "32", - total points of all subjects for this student of semester 1 "sem2": "0", - total points of all subjects for this student of semester 2 "sem3": "685", - total points of all subjects for this student of semester 3 } ]</code>
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!