Để tìm các ID có **đầy đủ** các giá trị nhất định trong cột Value (giả lập "khớp mảng"), dùng IN lọc, GROUP BY gom theo ID, và HAVING COUNT(*) = so_luong_phan_tu_can_khop.
Ví dụ: Tìm Id có cả 3 giá trị 34, 99, 56
Tạo bảng:
mysql> CREATE TABLE DemoTable1523 (Id INT, Value INT);
mysql> INSERT INTO DemoTable1523 VALUES
-> (1,56), (2,78), (1,34), (2,45), (1,99);
Dữ liệu: Id=1 có {56,34,99}, Id=2 có {78,45}.
Truy vấn:
mysql> SELECT Id FROM DemoTable1523
-> WHERE Value IN ('34','99','56')
-> GROUP BY Id
-> HAVING COUNT(*) = 3;
Kết quả:
+------+ | Id | +------+ | 1 | +------+
Giải thích
WHERE Value IN (34,99,56): chỉ giữ hàng có Value trong tập cần tìm.GROUP BY Id: gom hàng theo Id.HAVING COUNT(*) = 3: chỉ giữ Id có **đủ 3 giá trị** khớp (đảm bảo có cả 3).
⚠️ Lưu ý quan trọng
- Cách này **chỉ đúng nếu không có giá trị trùng lặp** cho cùng (Id, Value). Nếu có trùng, COUNT(*) sẽ sai.
- Để an toàn với trùng lặp:
HAVING COUNT(DISTINCT Value) = 3. - Kiểu dữ liệu: so sánh số với chuỗi
'34'MySQL tự chuyển đổi, nhưng tốt nhất dùng đúng kiểu:IN (34,99,56).
Mở rộng: Tìm Id có **ít nhất** một trong các giá trị
SELECT Id FROM DemoTable1523 WHERE Value IN (34,99,56) GROUP BY Id; -- không cần HAVING
Mở rộng: Tìm Id có **tất cả** giá trị trong danh sách động (từ bảng khác)
SELECT t.Id FROM DemoTable1523 t JOIN bang_gia_tri_can_tim v ON t.Value = v.Value GROUP BY t.Id HAVING COUNT(DISTINCT t.Value) = (SELECT COUNT(*) FROM bang_gia_tri_can_tim);