Mysql
 sql >> Baza danych >  >> RDS >> Mysql

zapytanie mysql dla połączonej listy

Zapytanie działa poprzez iterację po t_list tabela (ostatnia linia). Dla każdego wiersza w tej tabeli podzapytanie w SELECT klauzula ponownie wysyła zapytanie do tabeli, wyszukując element podrzędny bieżącego wiersza (WHERE parent = _parent -- ale _parent jest aliasem dla @r ). W każdej iteracji id dziecka jest przypisany do @r zmienna.

Aby dodać granice, ta odmiana powinna wystarczyć:

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;

Zastąp @start i @limit z id odpowiednio pierwszego elementu i maksymalną liczbę elementów do pobrania. Proszę przetestuj to tutaj .

Modelowanie takiej struktury danych za pomocą RDBMS jest prawdopodobnie złym pomysłem. Dlaczego po prostu nie użyć kolumny „indeks”? Pobranie listy staje się wtedy natychmiastowe:

SELECT * FROM list ORDER BY index_column ASC;

Być może Twoja lista ma się często zmieniać, ale takie zapytania powinny być dość szybkie, chyba że lista naprawdę się rozrośnie:

-- 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. Czy kopiowanie katalogu /var/lib/mysql jest dobrą alternatywą dla mysqldump?

  2. Bułgarskie języki Mysql, zestaw znaków

  3. Zmień format wyświetlania pola daty i czasu w MySQL PHP

  4. Skryptowanie przez ssh przez kit na windows

  5. SQL - AS - tabela nie istnieje - 1146