| 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: 13 let
|
|||
0