MySQL तालिका में प्रत्येक रिकॉर्ड के लिए किसी अन्य तालिका से पंक्तियों की गणना करें


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

मैं अंतिम पंक्ति को गिनने का प्रयास कर रहा हूं लेकिन इसके बजाय यह सभी परिणामों को गिनता है और एक परिणाम देता है

मुझे ऐसा कुछ मिल रहा है

यहाँ छवि विवरण दर्ज करें

चूंकि कई रिकॉर्ड हैं, क्योंकि K1052280 के लिए अटेंडेंस आईडी में दो प्रविष्टियां हैं। मैं उन लोगों को गिनना चाहता हूं और नंबर वापस करना चाहता हूं। कुछ इस तरह

यहाँ छवि विवरण दर्ज करें

जवाबों:


25

आपको सिर्फ 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>

कोशिश करो !!!


इस स्पष्ट स्पष्टीकरण के लिए धन्यवाद। अब, एक और सवाल। मैं कुल पर तालिका को कैसे सॉर्ट कर सकता हूं या रिकॉर्ड्स को फ़िल्टर कर सकता हूं जहां कुल = 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 वापस किए गए हैं।
इफिडी ओकोनकॉवो

स्पष्ट करने में सहायता के लिए, मेरी क्वेरी इस तरह से है: stackoverflow.com/a/24727261/2554788 , लेकिन बिना DISTINCTकीवर्ड के। COUNT के पास सबकुछ पैटर्न की तुलना में कुछ अलग (आमतौर पर अधिक और निश्चित रूप से, गलत) वापस करने के लिए क्या कारण होगा?
इफदी ओकोनकॉवो
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.