MySQL 테이블의 각 레코드에 대해 다른 테이블의 행 수


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

마지막 행을 계산하려고하지만 대신 모든 결과를 계산하고 하나의 결과를 반환합니다.

나는 같은 것을 얻고있다

여기에 이미지 설명을 입력하십시오

K1052280에 대한 출석 ID에 두 개의 항목이 있기 때문에 여러 레코드가 있기 때문에 그 수를 세고 숫자를 반환하고 싶습니다. 같은 것

여기에 이미지 설명을 입력하십시오

답변:


23

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

샘플 데이터

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

샘플 데이터로드

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

실행 된 그룹 별 쿼리

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>

시도 해봐 !!!


이 명확한 설명에 감사드립니다. 이제 한가지 더 질문이 있습니다. Total에서 테이블을 정렬하거나 Total = 0 인 레코드를 필터링하려면 어떻게해야합니까?
— Zonker.in.Geneva

추가 order by Total로 그룹 후
— PSN

@PSN 미리 알림 주셔서 감사합니다. 대부분의 경우 GROUP BY기본값을로 설정합니다 ORDER BY. 때로는 그렇지 않습니다. 그래서 ORDER BY사용할 수도 있습니다!
— RolandoMySQLDBA

@RolandoMySQLDBA, 내 문제에 대한 해결책을 기대하기 위해이 명쾌한 답변에 매달리게되어 죄송합니다! TestResult열이 있는 세 번째 테이블이 있다고 가정 해 보겠습니다 (StudentID, Result). 또한 각 학생을 위해 합류 TestResult하고 싶습니다 COUNT(TestResult.Result). 어떤 이유로 COUNT에 대한 초과 값을 얻는 동안 하위 쿼리를 사용하면 올바른 COUNT를 반환했습니다.
— Ifedi Okonkwo 2014

명확히하기 위해 내 쿼리는 stackoverflow.com/a/24727261/2554788 과 같지만 DISTINCT키워드는 없습니다. COUNT가 하위 쿼리 패턴과는 다른 것을 반환하는 이유는 무엇입니까?
— Ifedi Okonkwo 2014
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.