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

Lấy bản ghi ID xen kẽ (alternate) trong MySQL dùng IN() thay cho vòng lặp


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 ý

  • IN với danh sách tĩnh: Đơn giản, nhanh nếu danh sách ngắn.
  • IN với subquery: WHERE ClientId IN (SELECT id FROM other_table).
  • Tránh NOT IN với subquery có NULL (dùng NOT EXISTS).