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:
WHERElọc: chỉ lấy giao dịchDaXoa=0VÀTrangThaiTien='done'GROUP BY SUBSTR(UserId,1,3)gom theo prefix UserId (101, 102, 103...)HAVING COUNT(*) > 1giữ lại nhóm có ≥ 2 bản ghiORDER BY Id DESCsắ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.