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

Giới hạn số lượng đếm (COUNT) với GROUP BY trong MySQL dùng CASE WHEN


Vấn đề

Đếm số tin nhắn per user, nhưng nếu vượt quá ngưỡng (ví dụ 4) thì hiển thị nhãn 'Greater Than 4' thay vì số chính xác.

Ví dụ minh họa

Tạo bảng và chèn dữ liệu

mysql> CREATE TABLE DemoTable (
    UserId INT,
    UserMessage VARCHAR(100)
);
mysql> INSERT INTO DemoTable VALUES 
(1, 'Hi'), (2, 'Hello'), (2, 'Good'), (1, 'Nice'), 
(1, 'Awesome'), (1, 'Amazing'), (1, 'Good Morning');

Xem dữ liệu

mysql> SELECT * FROM DemoTable;
+--------+--------------+
| UserId | UserMessage  |
+--------+--------------+
| 1      | Hi           |
| 2      | Hello        |
| 2      | Good         |
| 1      | Nice         |
| 1      | Awesome      |
| 1      | Amazing      |
| 1      | Good Morning |
+--------+--------------+

Truy vấn GROUP BY với CASE giới hạn hiển thị

mysql> SELECT UserId, 
    CASE WHEN COUNT(*) < 4 THEN COUNT(*) ELSE 'Greater Than 4' END AS NumberOfMessage
FROM DemoTable 
GROUP BY UserId;

Kết quả

+--------+-----------------+
| UserId | NumberOfMessage |
+--------+-----------------+
| 1      | Greater Than 4  |
| 2      | 2               |
+--------+-----------------+

Giải thích

  • COUNT(*) đếm số dòng per UserId.
  • CASE WHEN COUNT(*) < 4 THEN COUNT(*) ELSE 'Greater Than 4' END: Nếu count < 4 hiện số, ngược lại hiện nhãn.
  • Kết quả cột NumberOfMessage kiểu VARCHAR (do nhánh ELSE trả về string).

Cách tốt hơn: Tách logic

SELECT UserId, 
       COUNT(*) AS msg_count,
       CASE WHEN COUNT(*) >= 4 THEN 'Greater Than 4' ELSE CAST(COUNT(*) AS CHAR) END AS display_count
FROM DemoTable GROUP BY UserId;

Tách cột count thật và cột hiển thị để ứng dụng dễ xử lý.

Ứng dụng: Phân trang, giới hạn hiển thị, bucketing

-- Bucketing độ tuổi
CASE 
  WHEN age < 18 THEN '0-17'
  WHEN age < 30 THEN '18-29'
  WHEN age < 50 THEN '30-49'
  ELSE '50+'
END AS age_group