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

Gộp nhiều SELECT trong MySQL với GROUP BY HAVING

Để tìm các bản ghi thỏa mãn nhiều điều kiện cùng lúc (giống intersection), sử dụng GROUP BY kết hợp HAVING COUNT(*).

Ví dụ: Tìm RoomId có đủ 3 dịch vụ (10, 20, 30)

Tạo bảng:

mysql> CREATE TABLE MergingSelectDemo (
    -> RoomServicesId INT,
    -> RoomId INT,
    -> ServiceId INT
    -> );

Chèn dữ liệu:

mysql> INSERT INTO MergingSelectDemo VALUES(10, 10, 10);
mysql> INSERT INTO MergingSelectDemo VALUES(20, 10, 20);
mysql> INSERT INTO MergingSelectDemo VALUES(30, 10, 30);
mysql> INSERT INTO MergingSelectDemo VALUES(50, 10, 50);
mysql> INSERT INTO MergingSelectDemo VALUES(110, 20, 20);
mysql> INSERT INTO MergingSelectDemo VALUES(120, 20, 30);

Dữ liệu:

+----------------+--------+-----------+
| RoomServicesId | RoomId | ServiceId |
+----------------+--------+-----------+
|             10 |     10 |        10 |
|             20 |     10 |        20 |
|             30 |     10 |        30 |
|             50 |     10 |        50 |
|            110 |     20 |        20 |
|            120 |     20 |        30 |
+----------------+--------+-----------+

Truy vấn: RoomId có cả 3 dịch vụ 10, 20, 30:

mysql> SELECT RoomId 
    -> FROM MergingSelectDemo 
    -> WHERE ServiceId IN (10, 20, 30)
    -> GROUP BY RoomId
    -> HAVING COUNT(*) = 3;

Kết quả:

+--------+
| RoomId |
+--------+
|     10 |
+--------+

Giải thích:

  • WHERE ServiceId IN (10,20,30): Lọc các hàng có dịch vụ cần tìm
  • GROUP BY RoomId: Gom nhóm theo phòng
  • HAVING COUNT(*) = 3: Chỉ giữ nhóm có đủ 3 dịch vụ (mỗi dịch vụ 1 hàng)

RoomId=20 chỉ có 2/3 dịch vụ (thiếu 10) nên bị loại.