Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [sql] Jak znaleźć brakujące ID w bazie
M@X
post
Post #1





Grupa: Zarejestrowani
Postów: 212
Pomógł: 0
Dołączył: 18.12.2003
Skąd: Warszawa

Ostrzeżenie: (0%)
-----


Witam.
Mam baze prawie 100 000 rekordów. Każdy rekord ma swój identyfikator (ID) nadawany rosnąco. Jednak w przedziale 1 - 100 000 są pewne luki. Niektóre rekordy są wykasowane.
Chciałbym sprawdzić jakich rekordów brakuje. Wylistować te brakujące ID....
Nie moge wpaść na żaden pomysł...
Może ktoś nakierować jakim zapytaniem sql mogę coś takiego wyciągnąć ?
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 6)
sowiq
post
Post #2





Grupa: Zarejestrowani
Postów: 1 890
Pomógł: 339
Dołączył: 14.12.2006
Skąd: Warszawa

Ostrzeżenie: (0%)
-----


  1. SELECT *
  2. FROM tabelka t1
  3. WHERE NOT EXISTS (
  4. SELECT *
  5. FROM tabelka t2
  6. WHERE t2.id = t1.id + 1
  7. )


Zapytanie dla każdego rekordu sprawdza czy istnieje rekord o ID większym o 1. Pamiętaj, że trzeba wyeliminować ostatni rekord w tabelce (bo wyższego ID nie będzie z definicji), ale to już zadanie domowe (IMG:style_emoticons/default/wink.gif)

Ten post edytował sowiq 5.11.2015, 17:56:42
Go to the top of the page
+Quote Post
aniolekx
post
Post #3





Grupa: Zarejestrowani
Postów: 340
Pomógł: 46
Dołączył: 31.07.2009
Skąd: A

Ostrzeżenie: (0%)
-----


jak przerwa bedzie wieksza niz jeden rekord to nie zwroci brakujacego id, prawdopowobnie musisz wygenerowac dodatkowa tabele z id od 1 do max ile masz w twojej tabeli i poprostu przylaczyc twoja tabele z warunkiem WHERE twoja_tabla.id = NULL
Go to the top of the page
+Quote Post
Crozin
post
Post #4





Grupa: Zarejestrowani
Postów: 6 476
Pomógł: 1306
Dołączył: 6.08.2006
Skąd: Kraków

Ostrzeżenie: (0%)
-----


Nie podałeś o jaką bazę chodzi. W czystym SQL-u chyba trzeba będzie faktycznie utworzyć tymczasową tabelę, w takim Postgresie będziesz mógł zrobić coś w stylu:
  1. SELECT id FROM (SELECT generate_series(1, max(id)) AS id FROM tbl_name) sub WHERE id NOT IN(SELECT id FROM tbl_name);


PS. Chyba nie planujesz wykorzystać tego do "uzupełnienia" luk?
Go to the top of the page
+Quote Post
trueblue
post
Post #5





Grupa: Zarejestrowani
Postów: 6 806
Pomógł: 1828
Dołączył: 11.03.2014

Ostrzeżenie: (0%)
-----


Zakres szukany od 0-9999. Dla większego zakresu trzeba dodać kolejne "paczki" UNION i dodać je w sumowaniu id.
  1. SELECT id
  2. FROM
  3. (
  4. SELECT (a.liczba+b.liczba*10+c.liczba*100+d.liczba*1000) AS id
  5. FROM (
  6. SELECT 0 AS liczba UNION ALL
  7. SELECT 1 UNION ALL
  8. SELECT 2 UNION ALL
  9. SELECT 3 UNION ALL
  10. SELECT 4 UNION ALL
  11. SELECT 5 UNION ALL
  12. SELECT 6 UNION ALL
  13. SELECT 7 UNION ALL
  14. SELECT 8 UNION ALL
  15. SELECT 9) AS a,
  16. (
  17. SELECT 0 AS liczba UNION ALL
  18. SELECT 1 UNION ALL
  19. SELECT 2 UNION ALL
  20. SELECT 3 UNION ALL
  21. SELECT 4 UNION ALL
  22. SELECT 5 UNION ALL
  23. SELECT 6 UNION ALL
  24. SELECT 7 UNION ALL
  25. SELECT 8 UNION ALL
  26. SELECT 9) AS b,
  27. (
  28. SELECT 0 AS liczba UNION ALL
  29. SELECT 1 UNION ALL
  30. SELECT 2 UNION ALL
  31. SELECT 3 UNION ALL
  32. SELECT 4 UNION ALL
  33. SELECT 5 UNION ALL
  34. SELECT 6 UNION ALL
  35. SELECT 7 UNION ALL
  36. SELECT 8 UNION ALL
  37. SELECT 9) AS c,
  38. (
  39. SELECT 0 AS liczba UNION ALL
  40. SELECT 1 UNION ALL
  41. SELECT 2 UNION ALL
  42. SELECT 3 UNION ALL
  43. SELECT 4 UNION ALL
  44. SELECT 5 UNION ALL
  45. SELECT 6 UNION ALL
  46. SELECT 7 UNION ALL
  47. SELECT 8 UNION ALL
  48. SELECT 9) AS d
  49. ) AS tmp
  50. LEFT JOIN tabela AS t ON t.id=tmp.id
  51. WHERE t.id IS NULL
Go to the top of the page
+Quote Post
redeemer
post
Post #6





Grupa: Zarejestrowani
Postów: 915
Pomógł: 210
Dołączył: 8.09.2009
Skąd: Tomaszów Lubelski/Wrocław

Ostrzeżenie: (0%)
-----


MySQL/MariaDB:
  1. SELECT @x:=0; SELECT IF(x+1=y, y, CONCAT(x+1, '-', y)) AS `missing` FROM (SELECT id, @x:=@x+1 AS x, IF(id>@x, @x:=id, 0) AS y FROM tabela ORDER BY id ASC) t WHERE t.y>0;
Go to the top of the page
+Quote Post
M@X
post
Post #7





Grupa: Zarejestrowani
Postów: 212
Pomógł: 0
Dołączył: 18.12.2003
Skąd: Warszawa

Ostrzeżenie: (0%)
-----


Cytat(Crozin @ 5.11.2015, 18:46:47 ) *
PS. Chyba nie planujesz wykorzystać tego do "uzupełnienia" luk?

nie (IMG:style_emoticons/default/smile.gif) spokojnie nie chodziło mi o uzupełnienie ID autoincrement (IMG:style_emoticons/default/smile.gif) )

tu znalazłem idealne rozwiązanie: http://www.xaprb.com/blog/2005/12/06/find-...uence-with-sql/
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 24.08.2025 - 12:42