MySQL Menghitung baris dari tabel lain untuk setiap record dalam tabel

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

Saya mencoba untuk menghitung baris terakhir tetapi ia menghitung semua hasil dan mengembalikan satu hasil

Saya mendapatkan sesuatu seperti

masukkan deskripsi gambar di sini

karena ada beberapa catatan karena ada dua entri di ID Kehadiran untuk K1052280 Saya ingin menghitung dan mengembalikan nomor. Sesuatu seperti

masukkan deskripsi gambar di sini

Ali Shaikh
sumber

Jawaban:

23

Anda baru saja melewatkan GROUP BY

QUERY ANDA DENGAN 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`;

CONTOH DATA

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

DATA SAMPEL DIMUAT

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

QUERY ANDA DENGAN GROUP BY EXECUTED

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>

COBALAH !!!

RolandoMySQLDBA
sumber
Terima kasih atas penjelasan yang jelas ini. Sekarang, satu pertanyaan lagi. Bagaimana saya bisa mengurutkan tabel pada Total atau memfilter catatan di mana Total = 0?
Zonker.in.Geneva
tambahkan order by Totalsetelah grup oleh
PSN
@ PSN Terima kasih atas pengingatnya. Dalam kebanyakan kasus, GROUP BYtetapkan default untuk ORDER BY. Terkadang tidak. Jadi, ORDER BYbisa juga digunakan !!!
RolandoMySQLDBA
@RolandoMySQLDBA, saya minta maaf untuk menghubungkan ke jawaban yang jelas ini, dengan harapan solusi untuk masalah saya! Mari kita berpura-pura ada meja ketiga, TestResultdengan kolom (StudentID, Result). Saya juga ingin bergabung TestResultdan akhirnya mendapatkan COUNT(TestResult.Result)untuk setiap siswa. Untuk beberapa alasan, saya mendapatkan nilai berlebih untuk COUNT, saat menggunakan subqueries mengembalikan COUNT yang benar.
Ifedi Okonkwo
Untuk membantu memperjelas, permintaan saya seperti ini: stackoverflow.com/a/24727261/2554788 , tetapi tanpa DISTINCTkata kunci. Apa yang akan menjadi alasan COUNT untuk mengembalikan sesuatu yang berbeda (biasanya lebih tinggi, dan tentu saja, salah) daripada pola subquery?
Ifedi Okonkwo