Kueri bekerja dengan mengulangi t_list
tabel (baris terakhir). Untuk setiap baris dalam tabel ini, sub-kueri di SELECT
klausa mengkueri ulang tabel, mencari anak baris saat ini (WHERE parent = _parent
-- tapi _parent
adalah alias untuk @r
). Pada setiap iterasi, id
child anak ditugaskan ke @r
variabel.
Untuk menambahkan batasan, variasi ini harus berhasil:
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;
Ganti @start
dan @limit
dengan id
item pertama, dan jumlah maksimum item untuk diambil, masing-masing. Silakan uji di sini
.
Memodelkan struktur data seperti itu dengan RDBMS mungkin merupakan ide yang buruk sama sekali. Mengapa tidak menggunakan kolom "indeks" saja? Mendapatkan daftar kemudian menjadi instan:
SELECT * FROM list ORDER BY index_column ASC;
Mungkin daftar Anda dimaksudkan untuk sering berubah, tetapi kueri seperti ini seharusnya cukup cepat kecuali jika daftarnya bertambah besar:
-- 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;