Nombre de lignes MySQL d'une autre table pour chaque enregistrement de la table


20
SELECT
  student.StudentID,
  student.`Name`,
  COUNT(attendance.AttendanceID) AS Total
FROM
  student
LEFT JOIN attendance ON student.StudentID = attendance.StudentID

J'essaie de compter la dernière ligne mais à la place, elle compte tous les résultats et renvoie un résultat

Je reçois quelque chose comme

entrez la description de l'image ici

car il y a plusieurs enregistrements car il y a deux entrées dans l'ID de présence pour K1052280 Je veux les compter et renvoyer le nombre. Quelque chose comme

entrez la description de l'image ici

Réponses:


23

Il vous manque juste le GROUP BY

VOTRE DEMANDE AVEC GROUP BY

SELECT
  student.StudentID,
  student.`Name`,
  COUNT(attendance.AttendanceID) AS Total
FROM
  student
LEFT JOIN attendance ON student.StudentID = attendance.StudentID
GROUP BY student.StudentID,student.`Name`;

EXEMPLE DE DONNÉES

DROP DATABASE IF EXISTS alishaikh; CREATE DATABASE alishaikh;
USE alishaikh
CREATE TABLE student
(
  StudentID CHAR(8) NOT NULL,
  Name VARCHAR(40),
  PRIMARY KEY (StudentID)
);
INSERT INTO student (StudentID,Name) VALUES
('k1052280','Ali Shaikh'),('k1052287','McKenzie Roth'),
('k1052288','Dacey Sullivan'),('k1052294','Zelda Cantu'),
('k1052295','Kimberly Melton'),('k1052296','Tatianna Cantrell'),
('k1052297','Morgan Thornton'),('k1052298','Allistair Barlow'),
('k1052299','Troy Fulton');
CREATE TABLE attendance
(
  AttendanceID INT NOT NULL AUTO_INCREMENT,
  StudentID CHAR(8) NOT NULL,
  PRIMARY KEY (AttendanceID),
  KEY (StudentID)
);
INSERT INTO attendance (StudentID) VALUES
('k1052280'),('k1052280'),('k1052287'),('k1052287'),
('k1052288'),('k1052295'),('k1052295'),('k1052295');

EXEMPLE DE DONNÉES CHARGÉES

mysql> DROP DATABASE IF EXISTS alishaikh; CREATE DATABASE alishaikh;
Query OK, 2 rows affected (0.01 sec)
Query OK, 1 row affected (0.00 sec)
mysql> USE alishaikh
Database changed
mysql> CREATE TABLE student
    -> (
    ->   StudentID CHAR(8) NOT NULL,
    ->   Name VARCHAR(40),
    ->   PRIMARY KEY (StudentID)
    -> );
Query OK, 0 rows affected (0.03 sec)

mysql> INSERT INTO student (StudentID,Name) VALUES
    -> ('k1052280','Ali Shaikh'),('k1052287','McKenzie Roth'),
    -> ('k1052288','Dacey Sullivan'),('k1052294','Zelda Cantu'),
    -> ('k1052295','Kimberly Melton'),('k1052296','Tatianna Cantrell'),
    -> ('k1052297','Morgan Thornton'),('k1052298','Allistair Barlow'),
    -> ('k1052299','Troy Fulton');
Query OK, 9 rows affected (0.00 sec)
Records: 9  Duplicates: 0  Warnings: 0

mysql> CREATE TABLE attendance
    -> (
    ->   AttendanceID INT NOT NULL AUTO_INCREMENT,
    ->   StudentID CHAR(8) NOT NULL,
    ->   PRIMARY KEY (AttendanceID),
    ->   KEY (StudentID)
    -> );
Query OK, 0 rows affected (0.02 sec)

mysql> INSERT INTO attendance (StudentID) VALUES
    -> ('k1052280'),('k1052280'),('k1052287'),('k1052287'),
    -> ('k1052288'),('k1052295'),('k1052295'),('k1052295');
Query OK, 8 rows affected (0.00 sec)
Records: 8  Duplicates: 0  Warnings: 0

VOTRE DEMANDE AVEC GROUPE PAR EXÉCUTÉE

mysql> SELECT
    ->   student.StudentID,
    ->   student.`Name`,
    ->   COUNT(attendance.AttendanceID) AS Total
    -> FROM
    ->   student
    -> LEFT JOIN attendance ON student.StudentID = attendance.StudentID
    -> GROUP BY student.StudentID,student.`Name`;
+-----------+-------------------+-------+
| StudentID | Name              | Total |
+-----------+-------------------+-------+
| k1052280  | Ali Shaikh        |     2 |
| k1052287  | McKenzie Roth     |     2 |
| k1052288  | Dacey Sullivan    |     1 |
| k1052294  | Zelda Cantu       |     0 |
| k1052295  | Kimberly Melton   |     3 |
| k1052296  | Tatianna Cantrell |     0 |
| k1052297  | Morgan Thornton   |     0 |
| k1052298  | Allistair Barlow  |     0 |
| k1052299  | Troy Fulton       |     0 |
+-----------+-------------------+-------+
9 rows in set (0.00 sec)

mysql>

ESSAIE !!!


Merci pour cette explication claire. Maintenant, encore une question. Comment puis-je trier le tableau sur Total ou filtrer les enregistrements où Total = 0?
Zonker.in.Geneva

ajouter order by Totalaprès le groupe par
PSN

@PSN Merci pour le rappel. Dans la plupart des cas, GROUP BYdéfinit la valeur par défaut pour ORDER BY. Parfois non. Donc, ORDER BYpourrait également être utilisé !!!
RolandoMySQLDBA

@RolandoMySQLDBA, je suis désolé de m'accrocher à cette réponse lucide, dans l'espoir d'une solution à mon problème! Imaginons qu'il y ait un troisième tableau, TestResultavec des colonnes de (StudentID, Result). Je souhaite également rejoindre TestResultet éventuellement obtenir COUNT(TestResult.Result)pour chaque étudiant. Pour une raison quelconque, j'obtiens des valeurs excessives pour COUNT, alors que l'utilisation de sous-requêtes a renvoyé les COUNT corrects.
Ifedi Okonkwo

Pour aider à clarifier, ma requête est comme ceci: stackoverflow.com/a/24727261/2554788 , mais sans les DISTINCTmots - clés. Quelle serait la raison pour laquelle les COUNT renvoient quelque chose de différent (généralement plus élevé et, bien sûr, erroné) que le modèle de sous-requête?
Ifedi Okonkwo
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.