MySQL dùng TINYINT(1) cho boolean (0 = false, 1 = true). Để đếm số lượng true/false trong một cột, dùng SUM() với điều kiện.
Cú pháp
SELECT
SUM(cột_boolean = 1) AS `True`,
SUM(cột_boolean = 0) AS `False`
FROM tên_bảng;
Trong MySQL, biểu thức so sánh trả về 1 (true) hoặc 0 (false), nên SUM() sẽ cộng dồn số lần đúng.
Ví dụ minh họa
Tạo bảng điểm danh sinh viên:
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)
Chèn dữ liệu (1 = Pass, 0 = Fail):
mysql> INSERT INTO countBooleanFieldDemo(StudentFirstName, isPassed) VALUES
-> ('Larry', 0), ('Mike', 1), ('Sam', 0), ('Carol', 1), ('Bob', 1),
-> ('David', 1), ('Ramit', 0), ('Chris', 1), ('Robert', 1);
Xem dữ liệu:
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 | +-----------+------------------+----------+
Đếm Pass/Fail trong một truy vấn:
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 | +------+-------+-----------------+
Mở rộng: Đếm theo nhóm (GROUP BY)
SELECT
ClassId,
SUM(isPassed = 1) AS Passed,
SUM(isPassed = 0) AS Failed,
COUNT(*) AS Total
FROM students
GROUP BY ClassId;
Tỷ lệ phần trăm
SELECT
SUM(isPassed = 1) * 100.0 / COUNT(*) AS PassRate
FROM countBooleanFieldDemo;
+----------+ | PassRate | +----------+ | 66.6667 | +----------+