Autor | Zpráva | ||
---|---|---|---|
Nevojsa Profil * |
#1 · Zasláno: 13. 8. 2013, 09:28:43 · Upravil/a: Nevojsa
Mám jednoduchou tabulku o sloupcích: (ID : uniq key, typ INT) a (TEXT : typ VARCHAR).
Sloupec ID má unikátní klíč... (kde ID = číslo řádku) a tabulka je nyní zaplněna asi 25000 řádky s tím že některá ID nejsou použita. Jak bych mohl vypsat do seznamu čísla řádků prozatím neexistujících ID v rozsahu do MAX ID = 25000? Pro lepší pochopení mého dotazu: Struktura tabulky: ID|TEXT --------------------- 1 | 'nějaký text' 3 | 'nějaký text' 5 | 'nějaký text' 7 | 'nějaký text' 8 | 'nějaký text' 9 | 'nějaký text' ... | '...' --------------------- a já potřebuju vypsat očekávané , zatím chybějcí ID, v tomto případě jdeo : 2,4,6 |
||
juriad Profil |
#2 · Zasláno: 13. 8. 2013, 09:36:49
Jestli chceš do těch mezer přidávat další řádky (zajistit, aby ID šla postupně), jdeš na to špatně. To se prostě nedělá Některé časteji řešené dotazy pro MySQL - FAQ » Recyklování primárních klíčů smazaných záznamů.
Pokud chceš vypsat všechny neexistující ID, je to dost složité. Nalezení nejmenšího neexistujícího ještě jde. |
||
Kajman Profil |
#3 · Zasláno: 13. 8. 2013, 09:38:55
Můžete si udělat pomocnou tabulku, kde budou souvislá řada čísel, pak stačí jednoduchý dotaz na id z pomocné tabulky, které nejsou v té první.
Také si to můžete vypsat nějakým programovacím jazykem podle získaných použitých id. A nejprve si přečtete faq, jak píše juriad. |
||
juriad Profil |
#4 · Zasláno: 13. 8. 2013, 10:22:44
Zkus následující. První poddotaz vygeneruje sekvenci čísel 1 až MAX(id) takovým odporným trikem. Následně se tato sekvence spojí s děravou tabulkou a v místech, kde je díra (chybí id) bude NULL, a právě řádky s NULL nás zajímají.
SELECT t AS missing FROM (SELECT @t + 0 AS t FROM tab AS t1, tab AS t2, tab AS t3, # join at least log_{COUNT(*)}(MAX(id)) tables # usually two tables is sufficient (SELECT Max(id) AS x FROM tab) AS max, (SELECT @t := 0) AS xxx WHERE ( @t := @t + 1 ) <= max.x) AS seq LEFT JOIN tab ON ( seq.t = tab.id ) WHERE id IS NULL |
||
Časová prodleva: 11 let
|
0