MySQL Đếm hàng từ một bảng khác cho mỗi bản ghi trong bảng


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

Tôi đang cố gắng đếm hàng cuối cùng nhưng thay vào đó, nó đếm tất cả các kết quả và trả về một kết quả

Tôi đang nhận được một cái gì đó như

nhập mô tả hình ảnh ở đây

vì có nhiều bản ghi vì có hai mục trong ID tham dự cho K1052280, tôi muốn đếm chúng và trả lại số. Cái gì đó như

nhập mô tả hình ảnh ở đây

Câu trả lời:


22

Bạn chỉ thiếu NHÓM THEO

SỐ LƯỢNG CỦA BẠN VỚI NHÓM THEO

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`;

DỮ LIỆU MẪU

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

MẪU DỮ LIỆU BỊ MẤT

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

SỐ LƯỢNG CỦA BẠN VỚI NHÓM THEO THỰC HIỆN

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>

HÃY THỬ MỘT LẦN !!!


Cảm ơn lời giải thích rõ ràng này. Bây giờ, một câu hỏi nữa. Làm cách nào tôi có thể sắp xếp bảng trên Tổng hoặc lọc ra các bản ghi trong đó Tổng = 0?
Zonker.in.Geneva

thêm order by Totalsau nhóm bởi
PSN

@PSN Cảm ơn đã nhắc nhở. Trong hầu hết các trường hợp, GROUP BYđặt mặc định cho ORDER BY. Đôi khi, nó không. Vì vậy, ORDER BYcũng có thể được sử dụng !!!
RolandoMySQLDBA

@RolandoMySQLDBA, tôi rất tiếc khi nối vào câu trả lời sáng suốt này, với hy vọng có một giải pháp cho vấn đề của tôi! Hãy giả vờ có một bảng thứ ba, TestResultvới các cột (StudentID, Result). Tôi cũng muốn tham gia TestResultvà cuối cùng nhận được COUNT(TestResult.Result)cho mỗi sinh viên. Vì một số lý do, tôi nhận được các giá trị vượt quá cho COUNT, trong khi sử dụng các truy vấn con đã trả về đúng các COUNT.
Ifedi Okonkwo

Để giúp làm rõ, truy vấn của tôi giống như thế này: stackoverflow.com/a/24727261/2554788 , nhưng không có DISTINCTtừ khóa. Điều gì sẽ là một lý do để các COUNT trả lại một cái gì đó khác nhau (thường là cao hơn, và tất nhiên, sai) so với mẫu truy vấn phụ?
Ifedi Okonkwo
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.