Autor Zpráva
Nevojsa
Profil *
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
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
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
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  

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm:

0