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

Khớp phần tử mảng trong truy vấn MySQL bằng IN và GROUP BY HAVING

Để 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

  1. WHERE Value IN (34,99,56): chỉ giữ hàng có Value trong tập cần tìm.
  2. GROUP BY Id: gom hàng theo Id.
  3. 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);