sql >> Databáze >  >> RDS >> Mysql

mysql dotaz na propojený seznam

Dotaz funguje tak, že se iteruje přes t_list tabulka (poslední řádek). Pro každý řádek v této tabulce poddotaz v SELECT klauzule se znovu dotazuje na tabulku a hledá podřízenou položku aktuálního řádku (WHERE parent = _parent -- ale _parent je alias pro @r ). Při každé iteraci id dítěte je přiřazena k @r proměnná.

Chcete-li přidat hranice, tato varianta by měla stačit:

SELECT * FROM (
    SELECT
        @r AS _parent,
        @r := (
            SELECT id
            FROM t_list
            WHERE
                ( @c = 0 AND _parent IS NULL AND parent IS NULL ) -- special case if the first item is the root
                OR (parent = _parent)
        ) AS id,
        @c := @c + 1 AS rank
    FROM (
        SELECT @c := 0, @r := parent FROM t_list WHERE id = @start
    ) AS ini,
    (
        SELECT id FROM t_list LIMIT @limit
    ) AS lim
) AS tmp WHERE id IS NOT NULL;

Nahraďte @start a @limit s id první položky a maximální počet položek k načtení. Prosím otestujte to zde .

Modelování takové datové struktury pomocí RDBMS je pravděpodobně úplně špatný nápad. Proč nepoužít pouze sloupec „index“? Získání seznamu se pak stane okamžitým:

SELECT * FROM list ORDER BY index_column ASC;

Možná se váš seznam má často měnit, ale dotazy jako tento by měly být poměrně rychlé, pokud se seznam opravdu nezvětší:

-- insert an element at position X 
UPDATE list SET index_column = index_column +1 WHERE index_column > X ORDER BY index_column DESC;
INSERT INTO list VALUE (some_value, X);

-- delete an element at position X 
DELETE FROM list WHERE index_column = X;
UPDATE list SET index_column = index_column -1 WHERE index_column > X ORDER BY index_column ASC;



  1. SQLServer IDENTITY Sloupec s textem

  2. opakujte mysql dotaz

  3. Jak poznáte, že potřebujete samostatné tabulky?

  4. Aliasing názvů polí v modelu SQLAlchemy nebo podkladové tabulce SQL