Để 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ìmGROUP BY RoomId: Gom nhóm theo phòngHAVING 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.