Mysql
 sql >> база данни >  >> RDS >> Mysql

mysql заявка за свързан списък

Заявката работи чрез итерация по t_list таблица (последният ред). За всеки ред в тази таблица, подзаявката в SELECT клаузата отправя повторна заявка към таблицата, търсейки дъщерното на текущия ред (WHERE parent = _parent -- но _parent е псевдоним за @r ). При всяка итерация id на детето се присвоява на @r променлива.

За да добавите граници, този вариант трябва да свърши работа:

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;

Заменете @start и @limit с id на първия елемент и максималния брой елементи за извличане, съответно. Моля, тествайте го тук .

Моделирането на такава структура от данни с RDBMS вероятно е напълно лоша идея. Защо просто не използвате колона "индекс"? След това получаването на списъка става незабавно:

SELECT * FROM list ORDER BY index_column ASC;

Може би списъкът ви е предназначен да се променя често, но заявките като тази трябва да са доста бързи, освен ако списъкът не стане наистина голям:

-- 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. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Как да ИЗБЕРЕТЕ две колони, където една колона трябва да е РАЗЛИЧНА?

  2. Вземете ID на таблицата след вмъкване с ColdFusion и MySQL

  3. Неизвестна грешка в колоната в този COUNT MySQL израз?

  4. Как мога да форматирам MySQL TIMEDIFF без секунди?

  5. Вмъкване на данни в MySQL база данни