MySQL Conta le righe da un'altra tabella per ogni record nella tabella


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

Sto cercando di contare l'ultima riga, ma invece conta tutti i risultati e restituisce un risultato

Sto ottenendo qualcosa di simile

inserisci qui la descrizione dell'immagine

poiché ci sono più record perché ci sono due voci nell'ID presenza per K1052280, voglio contarli e restituire il numero. Qualcosa di simile a

inserisci qui la descrizione dell'immagine

Risposte:


23

Ti manca il GROUP BY

LA TUA RICHIESTA CON 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`;

DATI CAMPIONE

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

DATI CAMPIONE CARICATI

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

LA TUA RICHIESTA CON IL GRUPPO DA ESEGUITO

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>

PROVACI !!!


Grazie per questa chiara spiegazione. Ora, un'altra domanda. Come posso ordinare la tabella su Total o filtrare i record in cui Total = 0?
Zonker.in.Geneva,

aggiungere order by Totaldopo il gruppo da
PSN il

@PSN Grazie per il promemoria. Nella maggior parte dei casi, GROUP BYimposta il valore predefinito per ORDER BY. A volte no. Quindi, ORDER BYpotrebbe anche essere usato !!!
RolandoMySQLDBA,

@RolandoMySQLDBA, mi dispiace agganciarmi a questa risposta lucida, nella speranza di una soluzione al mio problema! Facciamo finta che ci sia una terza tabella, TestResultcon colonne di (StudentID, Result). Vorrei anche unirmi TestResulted eventualmente ottenere COUNT(TestResult.Result)per ogni studente. Per qualche motivo, sto ottenendo valori in eccesso per il COUNT, mentre usando le subquery ho restituito i COUNT corretti.
Ifedi Okonkwo,

Per chiarire, la mia domanda è proprio questa: stackoverflow.com/a/24727261/2554788 , ma senza le DISTINCTparole chiave. Quale potrebbe essere la ragione per cui i COUNT restituiscono qualcosa di diverso (di solito più elevato e, ovviamente, sbagliato) rispetto al modello di subquery?
Ifedi Okonkwo,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.