sql >> Databasteknik >  >> RDS >> Mysql

MySQL:ta reda på saknade order-ID

Här är en annan lösning för att göra detta:

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;

Detta bör ge dig orders_id 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

Observera att: Jag skapade en TEMP tabell med värden från 0 till 9, för att använda för att generera en ankartabell som innehåller värden från 1 till 10000 istället för while-loopen som du hade i frågan du lade upp. Du kan styra värdena från den här tabellen beroende på värdena i din tabell. Om du hade värden som överstiger 10000 CROSS JOIN TEMP bord en gång till.

Uppdatering: Om orders_id är av datatypen varchar casta det bara till INTEGER som så:

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;

Uppdaterad SQL Fiddle Demo




  1. Django JSONFältfiltrering

  2. Vad är omfattningen av 'SET foreign_key_checks =0'?

  3. Mysql sök efter sträng och nummer med MATCH() AGAINST()

  4. Hur man infogar och hämtar data från en tabell till en annan tabell i mysql-databasen