Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> MySQL

Đếm giá trị boolean (true/false) trong một truy vấn MySQL duy nhất

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  |
+----------+