Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> MySQL

รวม DISTINCT และ COUNT ใน MySQL เพื่อนับจำนวนครั้งของแต่ละค่าที่ไม่ซ้ำ

คำตอบ: ใช่ ใช้ COUNT(*) กับ GROUP BY

ไม่ต้องเขียน DISTINCT แยก ใช้ GROUP BY column จัดกลุ่มค่าที่เหมือนกัน แล้ว COUNT(*) นับจำนวนในแต่ละกลุ่ม

ตัวอย่างสมบูรณ์

1. สร้างตารางและข้อมูล (ปีซ้ำกัน)

CREATE TABLE DemoTable1425 (JoiningYear INT);

INSERT INTO DemoTable1425 VALUES (2000);
INSERT INTO DemoTable1425 VALUES (2010);
INSERT INTO DemoTable1425 VALUES (2015);
INSERT INTO DemoTable1425 VALUES (2000);
INSERT INTO DemoTable1425 VALUES (2010);
INSERT INTO DemoTable1425 VALUES (2000);
INSERT INTO DemoTable1425 VALUES (2010);

2. ข้อมูลทั้งหมด

SELECT * FROM DemoTable1425;
+-------------+
| JoiningYear |
+-------------+
| 2000        |
| 2010        |
| 2015        |
| 2000        |
| 2010        |
| 2000        |
| 2010        |
+-------------+

3. Query: นับจำนวนแต่ละปี

SELECT JoiningYear, COUNT(*) AS Count
FROM DemoTable1425
GROUP BY JoiningYear;

4. ผลลัพธ์

+-------------+-------+
| JoiningYear | Count |
+-------------+-------+
| 2000        | 3     |
| 2010        | 3     |
| 2015        | 1     |
+-------------+-------+

การทำงาน

  1. GROUP BY JoiningYear - จัดกลุ่มแถวที่ Year เหมือนกัน
  2. COUNT(*) - นับแถวในแต่ละกลุ่ม
  3. คอลัมน์ JoiningYear ใน SELECT ต้องอยู่ใน GROUP BY (MySQL Strict Mode)

ตัวเลือกเพิ่มเติม

เรียงตามจำนวนมากไปน้อย

SELECT JoiningYear, COUNT(*) AS Cnt
FROM DemoTable1425
GROUP BY JoiningYear
ORDER BY Cnt DESC;

กรองเฉพาะที่มากกว่า 1 (Duplicate)

SELECT JoiningYear, COUNT(*) AS Cnt
FROM DemoTable1425
GROUP BY JoiningYear
HAVING COUNT(*) > 1;

หลายคอลัมน์ (Composite Group)

SELECT Department, Year, COUNT(*) AS Cnt
FROM Employees
GROUP BY Department, Year;

ฟังก์ชัน Aggregate อื่นใน GROUP BY

ฟังก์ชันคำอธิบาย
COUNT(*)นับแถวทั้งหมดในกลุ่ม
COUNT(col)นับแถวที่ col ไม่ใช่ NULL
SUM(col)ผลรวม
AVG(col)ค่าเฉลี่ย
MIN/MAX(col)ค่าต่ำสุด/สูงสุด
GROUP_CONCAT(col)รวมค่าเป็นสตริง

สรุป

ใช้ SELECT column, COUNT(*) FROM table GROUP BY column เพื่อดูจำนวนครั้งของแต่ละค่าที่ไม่ซ้ำ ไม่ต้องใช้ DISTINCT แยก