sql >> Database teknologi >  >> RDS >> Mysql

mysql-forespørgsel efter linket liste

Forespørgslen fungerer ved at iterere over t_list tabel (sidste linje). For hver række i denne tabel, underforespørgslen i SELECT klausul genforespørger tabellen og søger efter den aktuelle rækkes underordnede (WHERE parent = _parent -- men _parent er et alias for @r ). Ved hver iteration, barnets id er tildelt @r variabel.

For at tilføje grænser bør denne variation gøre det trick:

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;
 

Erstat @start og @limit med id af henholdsvis den første vare og det maksimale antal varer at hente. test det her .

Modellering af en sådan datastruktur med et RDBMS er sandsynligvis en dårlig idé. Hvorfor ikke bare bruge en "indeks" kolonne? Hentning af listen bliver derefter øjeblikkeligt:

SELECT * FROM list ORDER BY index_column ASC;
 

Måske er det meningen, at din liste skal ændres ofte, men forespørgsler som denne burde være ret hurtige, medmindre listen bliver virkelig stor:

-- 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. Service Broker-forbedringer i SQL Server 2016

  2. MySQL-forespørgsel for at finde kunder, der har bestilt to specifikke produkter

  3. MySQL Installer sidder fast ved start af service

  4. Fejl:Timeout for inaktivitet af håndtryk i Node.js MYSQL-modul