Mysql
 sql >> Baza danych >  >> RDS >> Mysql

MySQL:znajdź brakujące identyfikatory zamówień

Oto inne rozwiązanie, aby to zrobić:

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;

Powinno to dać orders_id s:

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

Pokaz SQL Fiddle

Pamiętaj, że: Utworzyłem TEMP tabeli z wartościami od 0 do 9, w celu wygenerowania tabeli zakotwiczenia zawierającej wartości od 1 do 10000 zamiast pętli while, którą miałeś w przesłanym zapytaniu. Możesz kontrolować wartości z tej tabeli w zależności od wartości w tabeli. Jeśli masz wartości przekraczające 10000 CROSS JOIN TEMP stół jeszcze raz.

Aktualizacja: Jeśli orders_id ma typ danych varchar po prostu prześlij go do INTEGER tak:

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;

Zaktualizowana prezentacja SQL Fiddle




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. mysql 5.7 jest znacznie wolniejszy niż mysql 5.6 na średnim sql

  2. MySQL - wymuś nieużywanie pamięci podręcznej do testowania szybkości zapytań

  3. Testy jednostkowe Railsów za pomocą tabel MyISAM

  4. Mysql:łączenie tabel dla rekordów tłumaczeń

  5. Jak wyłączyć tryb ścisły MySQL w Railsach?