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

นับจำนวนแถวตามเงื่อนไขค่าเฉพาะใน MySQL ด้วย COUNT และ IF


แนวคิด

ใช้ COUNT(IF(condition, 1, NULL)) เพื่อนับเฉพาะแถวที่ตรงเงื่อนไข COUNT จะไม่นับ NULL

รูปแบบคำสั่ง

SELECT 
  COUNT(*),
  COUNT(IF(FirstValue = 1, 1, NULL)) AS count_first_1,
  COUNT(IF(SecondValue = 2, 1, NULL)) AS count_second_2
FROM yourTable;

ตัวอย่างครบถ้วน

1. สร้างตาราง

mysql> create table countValueDemo 
    -> ( 
    -> ShippingDatetime datetime, 
    -> FirstValue int, 
    -> SecondValue int 
    -> ); 
Query OK, 0 rows affected (1.35 sec)

2. เพิ่มข้อมูล (มี NULL ปนอยู่)

mysql> insert into countValueDemo values('2019-01-23',1,2); 
Query OK, 1 row affected (0.24 sec)
mysql> insert into countValueDemo values('2017-02-21',NULL,2); 
Query OK, 1 row affected (0.13 sec)
mysql> insert into countValueDemo values('2016-04-12',1,NULL); 
Query OK, 1 row affected (0.19 sec)

3. ดูข้อมูล

mysql> select * from countValueDemo;
+---------------------+------------+-------------+
| ShippingDatetime    | FirstValue | SecondValue |
+---------------------+------------+-------------+
| 2019-01-23 00:00:00 | 1          | 2           |
| 2017-02-21 00:00:00 | NULL       | 2           |
| 2016-04-12 00:00:00 | 1          | NULL        |
+---------------------+------------+-------------+

4. Query นับตามเงื่อนไข

mysql> SELECT ShippingDatetime, 
    -> COUNT(*), 
    -> COUNT(IF(FirstValue = 1, 1, NULL)), 
    -> COUNT(IF(SecondValue = 2, 1, NULL)) 
    -> FROM countValueDemo;
+---------------------+----------+----------------------------------------+-----------------------------------------+
| ShippingDatetime    | COUNT(*) | COUNT(IF(FirstValue = 1, 1, NULL))     | COUNT(IF(SecondValue = 2, 1, NULL))     |
+---------------------+----------+----------------------------------------+-----------------------------------------+
| 2019-01-23 00:00:00 | 3        | 2                                      | 2                                       |
+---------------------+----------+----------------------------------------+-----------------------------------------+

วิธีอื่นที่ทันสมัยกว่า (MySQL 8.0+)

ใช้ SUM กับ Boolean Expression

SELECT 
  COUNT(*) AS total,
  SUM(FirstValue = 1) AS count_first_1,
  SUM(SecondValue = 2) AS count_second_2
FROM countValueDemo;

ใช้ COUNT กับ CASE WHEN

SELECT 
  COUNT(*) AS total,
  COUNT(CASE WHEN FirstValue = 1 THEN 1 END) AS count_first_1,
  COUNT(CASE WHEN SecondValue = 2 THEN 1 END) AS count_second_2
FROM countValueDemo;

ขยาย: นับหลายเงื่อนไขพร้อมกัน

SELECT 
  COUNT(*) AS total,
  SUM(status = 'active') AS active_count,
  SUM(status = 'pending') AS pending_count,
  SUM(status = 'cancelled') AS cancelled_count,
  SUM(status NOT IN ('active','pending','cancelled')) AS other_count
FROM orders;

สรุป: SUM(condition) ทันสมัยกว่า อ่านง่ายกว่า และทำงานได้เร็วเท่ากัน