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

MySQL นับจำนวนค่าที่รู้จักล่วงหน้า (Known Distinct Values) ด้วย SUM

Conditional Counting: นับค่าเฉพาะที่รู้จักล่วงหน้า

ใช้ SUM(condition) โดย MySQL แปลง Boolean เป็น 1 (True) / 0 (False) อัตโนมัติ

ตัวอย่าง: นับชื่อเฉพาะ John, Robert, Sam, Mike

CREATE TABLE DemoTable636 (
    StudentId INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
    StudentFirstName VARCHAR(100)
);

INSERT INTO DemoTable636(StudentFirstName) VALUES
('John'), ('Robert'), ('Robert'), ('Sam'), ('Mike'), ('John'), ('Robert');

Query: นับแต่ละชื่อแยกกัน

SELECT 
    SUM(StudentFirstName = 'John')   AS JOHN_COUNT,
    SUM(StudentFirstName = 'Robert') AS ROBERT_COUNT,
    SUM(StudentFirstName = 'Sam')    AS SAM_COUNT,
    SUM(StudentFirstName = 'Mike')   AS MIKE_COUNT
FROM DemoTable636;

ผลลัพธ์:

+------------+--------------+-----------+------------+
| JOHN_COUNT | ROBERT_COUNT | SAM_COUNT | MIKE_COUNT |
+------------+--------------+-----------+------------+
| 2          | 3            | 1         | 1          |
+------------+--------------+-----------+------------+

เทคนิค: Boolean Arithmetic ใน MySQL

  • TRUE = 1, FALSE = 0
  • condition1 + condition2 = OR Logic (นับรวม)
  • condition1 * condition2 = AND Logic (นับที่ตรงทั้งคู่)

ตัวอย่าง: นับ John หรือ Robert (OR)

SELECT 
    SUM(StudentFirstName = 'John' OR StudentFirstName = 'Robert') AS john_or_robert
FROM DemoTable636;  -- 5

ตัวอย่าง: นับ John และ Age > 20 (AND) - ต้องมี Age Column

SELECT 
    SUM(StudentFirstName = 'John' AND StudentAge > 20) AS john_adult
FROM DemoTable636;

เปรียบเทียบวิธีนับ

MethodQueryเหมาะสำหรับPerformance
SUM(Boolean)SUM(col = 'val')Known Values, Pivot Table🟢 เร็ว (Single Scan)
COUNT(CASE)COUNT(CASE WHEN col='val' THEN 1 END)Standard SQL, Complex Cond🟢 เร็ว
GROUP BYGROUP BY col, COUNT(*)Unknown Values, All Values🟡 ต้อง Sort/Hash
COUNT(*) FILTERCOUNT(*) FILTER (WHERE col='val')PostgreSQL, MySQL 8.0.2+🟢 เร็ว

MySQL 8.0.2+: COUNT(*) FILTER (Standard SQL)

SELECT 
    COUNT(*) FILTER (WHERE StudentFirstName = 'John')   AS JOHN_COUNT,
    COUNT(*) FILTER (WHERE StudentFirstName = 'Robert') AS ROBERT_COUNT,
    COUNT(*) FILTER (WHERE StudentFirstName = 'Sam')    AS SAM_COUNT,
    COUNT(*) FILTER (WHERE StudentFirstName = 'Mike')   AS MIKE_COUNT
FROM DemoTable636;

Dynamic Pivot (Unknown Values) - Prepared Statement

-- ต้องใช้ Dynamic SQL ใน Stored Procedure
-- หรือ Application Layer สร้าง Query