Truy vấn hoạt động bằng cách lặp qua t_list
bảng (dòng cuối cùng). Đối với mỗi hàng trong bảng này, truy vấn phụ trong SELECT
mệnh đề truy vấn lại bảng, tìm kiếm con của hàng hiện tại (WHERE parent = _parent
- but _parent
là bí danh cho @r
). Tại mỗi lần lặp lại, id
của trẻ được gán cho @r
biến.
Để thêm ranh giới, biến thể này phải thực hiện thủ thuật:
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;
Thay thế @start
và @limit
với id
của mục đầu tiên và số lượng mục tối đa để truy xuất, tương ứng. Vui lòng kiểm tra tại đây
.
Mô hình hóa cấu trúc dữ liệu như vậy với RDBMS hoàn toàn có thể là một ý tưởng tồi. Tại sao không chỉ sử dụng một cột "chỉ mục"? Việc lấy danh sách sau đó trở nên tức thì:
SELECT * FROM list ORDER BY index_column ASC;
Có thể danh sách của bạn thường xuyên thay đổi, nhưng các truy vấn như thế này sẽ khá nhanh trừ khi danh sách phát triển thực sự lớn:
-- 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;