MySQL Tablodaki her kayıt için başka bir tablodaki satırları say


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

Son satırı saymaya çalışıyorum ama bunun yerine tüm sonuçları sayar ve bir sonuç döndürür

Gibi bir şey alıyorum

resim açıklamasını buraya girin

K1052280 için Katılım Kimliği'nde iki giriş olduğundan birden fazla kayıt olduğundan bunları saymak ve numarayı döndürmek istiyorum. Gibi bir şey

resim açıklamasını buraya girin

Yanıtlar:


25

GROUP BY grubunu kaçırıyorsunuz

GROUP BY İLE SORGUNUZ

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

ÖRNEK VERİ

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

ÖRNEK VERİLER YÜKLENDİ

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

YÜRÜTÜLEN GRUP İLE SORGUNUZ

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>

BİR ŞANS VER !!!


Bu açık açıklama için teşekkürler. Şimdi bir soru daha. Toplamdaki tabloyu nasıl sıralayabilirim veya Toplam = 0 olan kayıtları nasıl filtreleyebilirim?
Zonker.in.Geneva

order by Totalgruptan sonra ekle
PSN

@PSN Hatırlatma için teşekkürler. Çoğu durumda GROUP BYiçin varsayılanı ayarlar ORDER BY. Bazen değil. Yani, ORDER BYayrıca kullanılabilir !!!
RolandoMySQLDBA

@RolandoMySQLDBA, sorunuma bir çözüm umuduyla bu berrak cevabı taktığım için üzgünüm! TestResultSütunları olan üçüncü bir tablo olduğunu varsayalım (StudentID, Result). Ayrıca her öğrenciye katılmak TestResultve sonunda almak istiyorum COUNT(TestResult.Result). Nedense, alt sorguları kullanarak doğru COUNTs döndürürken, COUNT için aşırı değerler alıyorum.
Ifedi Okonkwo

Açıklığa kavuşturmak için, sorgum şöyle: stackoverflow.com/a/24727261/2554788 , ancak DISTINCTanahtar kelimeler olmadan . COUNT öğelerin alt sorgu modelinden farklı (genellikle daha yüksek ve elbette yanlış) bir şey döndürmesinin nedeni ne olabilir?
Ifedi Okonkwo
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.