क्वेरी 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;