クエリは、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;