2010-04-08 3 views
1

J'essaie d'exécuter une requête qui additionne le nombre total de sujets dans une classe. Une classe a beaucoup de sujets. Il y a une table 'teachersclasses' entre les enseignants (la table des utilisateurs) et les classes. Les principes semblent assez simples mais j'ai du mal à obtenir que ma page affiche le nombre de sujets pour chaque classe (directement associée à l'enseignant)Ajouter un numéro de ligne et afficher le total à l'aide de COUNT (PHP MySQL)

C'est ce que j'ai jusqu'ici, en essayant de faire usage de la COUNT avec une imbriqué SELECT:

SELECT (SELECT count(*) FROM subjects WHERE subjects.classid = class.classid) AS total_subjects, class.classname, class.classid 

de la classe

Je fais appel en 'NUM_SUBJECTS' pour présenter le total dans une boucle while:

  <?php echo $row['total_subjects']?> 

De ce qui précède, je reçois le total des sujets pour une classe, mais dans la même rangée du tableau (pour une classe) et mon autre boucle alors ne fonctionne plus, ce qui renvoie toutes les classes associées à un enseignant :(... Un peu de gâchis maintenant! Je sais retourner les classes pour un enseignant particulier, je peux faire une clause WHERE supplémentaire sur la session de 'teacherid' mais je pense que ma requête devient trop compliquée pour moi que des erreurs surgissent partout. Quelqu'un a une solution rapide pour cela! Merci beaucoup

Répondre

0
SELECT count(*) FROM subjects GROUP BY subjects.classid 
+0

Cela ne va pas aider. Il retournera simplement une liste de nombres sans ordre particulier, par exemple: '15, 22, 16, 23, 23, 24'. –

0

Vous ne ont pas besoin « subselect », vous pouvez juste faire une JOIN et count()

SELECT 
    class.*, 
    count(subjects.*) AS total_subjects 
FROM 
    class 
    LEFT JOIN subjects ON class.classid = subjects.classid 
WHERE 
    class.teacherid = ? 
GROUP BY 
    class.classid 
1

Votre requête est probablement pas optimale. Il pourrait être une bonne idée de réécrire comme une jointure:

SELECT 
    total_subjects, 
    class.classname, 
    class.classid 
FROM class 
JOIN (
    SELECT classid, count(*) AS total_subjects 
    FROM subjects 
    GROUP BY classid 
) AS T1 
ON T1.classid = class.classid 

En ce qui concerne votre problème, vous n'avez pas besoin de deux boucles. C'est un ensemble de résultats unique avec trois colonnes, comme le montre clairement ma réécriture. Vous n'avez besoin que d'une boucle pour lire tous les résultats.

Questions connexes