MySQL Count-Zeilen aus einer anderen Tabelle für jeden Datensatz in der Tabelle

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

Ich versuche, die letzte Zeile zu zählen, aber stattdessen werden alle Ergebnisse gezählt und ein Ergebnis zurückgegeben

Ich bekomme so etwas wie

Bildbeschreibung hier eingeben

Da in der Anwesenheits-ID für K1052280 zwei Einträge vorhanden sind, möchte ich diese zählen und die Nummer zurückgeben. Etwas wie

Bildbeschreibung hier eingeben

Ali Shaikh
quelle

Antworten:

21

Sie vermissen nur die GROUP BY

IHRE FRAGE MIT 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`;

BEISPIELDATEN

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');

PROBENDATEN GELADEN

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

IHRE FRAGE MIT GRUPPE DURCHGEFÜHRT

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>

VERSUCHE ES !!!

RolandoMySQLDBA
quelle
Danke für diese klare Erklärung. Nun noch eine Frage. Wie kann ich die Tabelle nach Gesamt sortieren oder die Datensätze mit Gesamt = 0 herausfiltern?
Zonker.in.Geneva
order by TotalNach Gruppe hinzufügen von
PSN
@PSN Danke für die Erinnerung. In den meisten Fällen wird GROUP BYdie Standardeinstellung für festgelegt ORDER BY. Manchmal nicht. Könnte also ORDER BYauch benutzt werden !!!
RolandoMySQLDBA
@RolandoMySQLDBA, es tut mir leid, dass ich mich an diese klare Antwort anschließe, in der Hoffnung, eine Lösung für mein Problem zu finden! Nehmen wir an, es gibt eine dritte Tabelle TestResultmit Spalten von (StudentID, Result). Ich möchte auch mitmachen TestResultund irgendwann COUNT(TestResult.Result)für jeden Schüler bekommen. Aus irgendeinem Grund erhalte ich überschüssige Werte für COUNT, während Unterabfragen die richtigen COUNTs zurückgaben.
Ifedi Okonkwo
Zur Verdeutlichung lautet meine Abfrage folgendermaßen: stackoverflow.com/a/24727261/2554788 , jedoch ohne die DISTINCTSchlüsselwörter. Was wäre ein Grund für die COUNTs, etwas anderes (normalerweise höheres und natürlich falsches) zurückzugeben als das Unterabfragemuster?
Ifedi Okonkwo