Vấn đề
Muốn lấy các bản ghi có ClientId = 101, 103, 105 (xen kẽ/bước nhảy 2) mà không dùng vòng lặp procedural.
Giải pháp: WHERE ... IN (danh sách)
SELECT ClientId, ClientName, ClientAge FROM DemoTable WHERE ClientId IN (101, 103, 105);
Ví dụ minh họa
Tạo bảng và chèn dữ liệu
mysql> CREATE TABLE DemoTable (
ClientId INT, ClientName VARCHAR(100), ClientAge INT
);
mysql> INSERT INTO DemoTable VALUES (100, 'Chris', 34), (101, 'Robert', 31), (103, 'David', 33), (104, 'Mike', 45), (105, 'Sam', 39);
Truy vấn IN
mysql> SELECT ClientId, ClientName, ClientAge FROM DemoTable WHERE ClientId IN (101, 103, 105);
Kết quả
+----------+------------+-----------+ | ClientId | ClientName | ClientAge | +----------+------------+-----------+ | 101 | Robert | 31 | | 103 | David | 33 | | 105 | Sam | 39 | +----------+------------+-----------+
Tự động hóa danh sách ID xen kẽ (nếu ID liên tục)
Nếu ID là dãy số liên tục (100,101,102,103,104,105...), muốn lấy chẵn/lẻ:
-- Lẻ (101, 103, 105...) WHERE ClientId % 2 = 1 -- Chẵn (100, 102, 104...) WHERE ClientId % 2 = 0
Nếu ID không liên tục: Dùng biến số hoặc CTE (MySQL 8.0+)
WITH numbered AS (
SELECT *, ROW_NUMBER() OVER (ORDER BY ClientId) AS rn FROM DemoTable
)
SELECT * FROM numbered WHERE rn % 2 = 0; -- Hàng chẵn theo thứ tự
Lưu ý
INvới danh sách tĩnh: Đơn giản, nhanh nếu danh sách ngắn.INvới subquery:WHERE ClientId IN (SELECT id FROM other_table).- Tránh
NOT INvới subquery có NULL (dùng NOT EXISTS).