แนวคิด
MySQL ใช้ TINYINT(1) แทน Boolean (0 = false, 1 = true) ใช้ SUM() กับเงื่อนไข เพื่อนับจำนวน true/false ใน query เดียว
หลักการ
SUM(isPassed = 1)→ นับจำนวน true (เงื่อนไขเป็นจริง = 1)SUM(isPassed = 0)→ นับจำนวน false (เงื่อนไขเป็นเท็จ = 0)
ตัวอย่างครบถ้วน
1. สร้างตารางนักเรียน
mysql> create table countBooleanFieldDemo
-> (
-> StudentId int NOT NULL AUTO_INCREMENT PRIMARY KEY,
-> StudentFirstName varchar(20),
-> isPassed tinyint(1)
-> );
Query OK, 0 rows affected (0.63 sec)
2. เพิ่มข้อมูล (ผสม true/false)
mysql> insert into countBooleanFieldDemo(StudentFirstName,isPassed) values('Larry',0);
Query OK, 1 row affected (0.12 sec)
mysql> insert into countBooleanFieldDemo(StudentFirstName,isPassed) values('Mike',1);
Query OK, 1 row affected (0.17 sec)
mysql> insert into countBooleanFieldDemo(StudentFirstName,isPassed) values('Sam',0);
Query OK, 1 row affected (0.21 sec)
mysql> insert into countBooleanFieldDemo(StudentFirstName,isPassed) values('Carol',1);
Query OK, 1 row affected (0.15 sec)
mysql> insert into countBooleanFieldDemo(StudentFirstName,isPassed) values('Bob',1);
Query OK, 1 row affected (0.16 sec)
mysql> insert into countBooleanFieldDemo(StudentFirstName,isPassed) values('David',1);
Query OK, 1 row affected (0.13 sec)
mysql> insert into countBooleanFieldDemo(StudentFirstName,isPassed) values('Ramit',0);
Query OK, 1 row affected (0.28 sec)
mysql> insert into countBooleanFieldDemo(StudentFirstName,isPassed) values('Chris',1);
Query OK, 1 row affected (0.20 sec)
mysql> insert into countBooleanFieldDemo(StudentFirstName,isPassed) values('Robert',1);
Query OK, 1 row affected (0.16 sec)
3. ดูข้อมูลทั้งหมด
mysql> select * from countBooleanFieldDemo;
+-----------+------------------+----------+ | StudentId | StudentFirstName | isPassed | +-----------+------------------+----------+ | 1 | Larry | 0 | | 2 | Mike | 1 | | 3 | Sam | 0 | | 4 | Carol | 1 | | 5 | Bob | 1 | | 6 | David | 1 | | 7 | Ramit | 0 | | 8 | Chris | 1 | | 9 | Robert | 1 | +-----------+------------------+----------+
4. Query นับ true/false และคำนวณเปอร์เซ็นต์
mysql> select
-> sum(isPassed = 1) as `True`,
-> sum(isPassed = 0) as `False`,
-> (case when sum(isPassed = 1) > 0 then sum(isPassed = 0) / sum(isPassed = 1) end) As TotalPercentage
-> from countBooleanFieldDemo;
+------+-------+-----------------+ | True | False | TotalPercentage | +------+-------+-----------------+ | 6 | 3 | 0.5000 | +------+-------+-----------------+
วิธีอื่น: ใช้ COUNT กับ IF
SELECT COUNT(IF(isPassed = 1, 1, NULL)) AS `True`, COUNT(IF(isPassed = 0, 1, NULL)) AS `False` FROM countBooleanFieldDemo;
ขยาย: นับตามกลุ่ม (GROUP BY)
SELECT class_id, SUM(isPassed = 1) AS passed, SUM(isPassed = 0) AS failed, COUNT(*) AS total FROM students GROUP BY class_id;
สรุป: ใช้ SUM(condition) นับ boolean ได้ใน query เดียว เร็วและอ่านง่าย