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

MySQL: GROUP BY với WHERE và HAVING COUNT > 1

Kết hợp WHERE (lọc trước khi gom nhóm) và HAVING (lọc sau khi gom nhóm) để tìm nhóm có số lượng bản ghi lớn hơn ngưỡng.

Cú pháp

SELECT * FROM ten_bang
WHERE dieu_kien_loc_truoc
GROUP BY bieu_thuc_gom_nhom
HAVING COUNT(*) > n
ORDER BY cot_sap_xep DESC;

Ví dụ minh họa

Tạo bảng giao dịch:

mysql> CREATE TABLE NhomCoDieuKien (
    -> Id INT NOT NULL AUTO_INCREMENT,
    -> DaXoa TINYINT(1),
    -> TrangThaiTien VARCHAR(20),
    -> UserId INT,
    -> PRIMARY KEY(Id)
    -> );

Chèn 19 bản ghi mẫu (xem nội dung gốc).

Truy vấn: User có nhiều giao dịch "done" và không bị xóa

mysql> SELECT * FROM NhomCoDieuKien
    -> WHERE DaXoa = 0 AND TrangThaiTien = 'done'
    -> GROUP BY SUBSTR(UserId, 1, 3)  -- gom theo 3 chữ số đầu UserId
    -> HAVING COUNT(*) > 1
    -> ORDER BY Id DESC;

Kết quả (3 nhóm UserId: 101, 103, 106 thỏa mãn >1 giao dịch done):

+----+---------+--------------+--------+
| Id | DaXoa   | TrangThaiTien| UserId |
+----+---------+--------------+--------+
| 18 | 0       | done         | 106    |
| 8  | 0       | done         | 103    |
| 2  | 0       | done         | 101    |
+----+---------+--------------+--------+

Giải thích:

  • WHERE lọc: chỉ lấy giao dịch DaXoa=0 VÀ TrangThaiTien='done'
  • GROUP BY SUBSTR(UserId,1,3) gom theo prefix UserId (101, 102, 103...)
  • HAVING COUNT(*) > 1 giữ lại nhóm có ≥ 2 bản ghi
  • ORDER BY Id DESC sắp xếp kết quả cuối

Lưu ý: SELECT * với GROUP BY không chuẩn SQL (MySQL cho phép nhưng chỉ lấy giá trị ngẫu nhiên trong nhóm). Nên liệt kê rõ cột hoặc dùng aggregate function.