Mysql
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Mysql

MySQL:tìm ra các ID đơn hàng bị thiếu

Đây là một giải pháp khác để thực hiện việc này:

CREATE TABLE TEMP 
(n int);
INSERT INTO Temp VALUES(0),(1),(2),(3),(4),(5),(6),(7),(8),(9);

SET @maxid = (SELECT MAX(orders_id) FROM orders);

SELECT     s.id 
FROM
(
    SELECT id
    FROM
    (
       SELECT t4.n * 1000 + t3.n * 100 + t2.n * 10 + t1.n + 1 AS id
       FROM         TEMP AS t1
       CROSS JOIN TEMP AS t2
       CROSS JOIN TEMP AS t3
       CROSS JOIN TEMP AS t4
    ) t 
    WHERE id BETWEEN 1000 AND @maxid
) s 
LEFT JOIN orders t ON s.id = t.`orders_id` 
WHERE t.`orders_id` IS NULL;

Điều này sẽ cung cấp cho bạn orders_id s:

ID
1001
1002
1005
1006
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017
1018
1019
1021
1022
1023
1024

Bản trình diễn SQL Fiddle

Lưu ý rằng: Tôi đã tạo TEMP bảng có các giá trị từ 0 đến 9, để sử dụng để tạo một bảng liên kết chứa các giá trị từ 1 đến 10000 thay vì vòng lặp while mà bạn đã có trong truy vấn bạn đã đăng. Bạn có thể kiểm soát các giá trị từ bảng này tùy thuộc vào các giá trị trong bảng của bạn. Nếu bạn có các giá trị vượt quá 10000 CROSS JOIN TEMP bảng một lần nữa.

Cập nhật: Nếu orders_id thuộc loại dữ liệu varchar chỉ cần truyền nó tới INTEGER như vậy:

SELECT     s.id 
FROM
(
    SELECT id
    FROM
    (
       SELECT t4.n * 1000 + t3.n * 100 + t2.n * 10 + t1.n + 1 AS id
       FROM         TEMP AS t1
       CROSS JOIN TEMP AS t2
       CROSS JOIN TEMP AS t3
       CROSS JOIN TEMP AS t4
  ) t WHERE id between 1000 AND @maxid
) s 
LEFT JOIN
(
    SELECT CONVERT(orders_id, UNSIGNED INTEGER) AS orders_id 
    FROM orders
) t ON s.id = t.`orders_id` 
WHERE t.`orders_id` IS NULL;

Bản trình diễn SQL Fiddle cập nhật




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. thay thế đối sánh chính xác trong php

  2. Nâng cấp MySQL (BẬT KHÓA DUPLICATE) bằng cách sử dụng Tuyên bố chuẩn bị trước của JDBC

  3. Câu lệnh MySQL mất hơn phút để thực thi

  4. Cái nào nhanh hơn:nhiều CHÈN đơn hay một CHÈN nhiều hàng?

  5. Làm cách nào để đặt lại hành vi người dùng 'root' mặc định trên MySQL 5.7