Mysql
 sql >> Datenbank >  >> RDS >> Mysql

MySQL:Finden Sie fehlende Auftrags-IDs heraus

Hier ist eine andere Lösung dafür:

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;

Dies sollte Ihnen die orders_id geben s:

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

SQL-Fiddle-Demo

Beachten Sie Folgendes: Ich habe ein TEMP erstellt Tabelle mit Werten von 0 bis 9, um anstelle der While-Schleife, die Sie in der von Ihnen geposteten Abfrage hatten, eine Ankertabelle mit Werten von 1 bis 10000 zu generieren. Sie können die Werte aus dieser Tabelle abhängig von den Werten in Ihrer Tabelle steuern. Wenn Sie Werte hatten, die 10000 überschreiten CROSS JOIN der TEMP Tisch noch einmal.

Aktualisierung: Wenn die orders_id ist vom Datentyp varchar wandeln Sie es einfach in INTEGER um so:

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;

Aktualisierte SQL Fiddle-Demo