我在 SQLite 数据库中有一个嵌套集模型。兄弟姐妹需要按字母顺序排序。下面是全集,不过需要排序的兄弟是第二层。如您所见,它们按以下顺序开始:
Kanval, Wafiyah, Qamar, Lamya, Chaman, Fadila
familyName | lft | rgt
----------------------+------+-----
Families | 1 | 62
-- Kanval | 2 | 9
---- Omera | 3 | 4
---- Dafiyah | 5 | 6
---- Daneen | 7 | 8
-- Qamar | 10 | 19
---- Deeba | 11 | 12
---- Pakeezah | 13 | 14
---- Rabiya | 15 | 16
---- Banafsha | 17 | 18
-- Lamya | 20 | 33
---- Banujah | 21 | 22
---- Buthaynah | 23 | 24
---- Vardah | 25 | 26
---- Kaneez | 27 | 28
---- Parveen | 29 | 30
---- Ghunyah | 31 | 32
-- Chaman | 34 | 45
---- Kanz | 35 | 36
---- Varisha | 37 | 38
---- Kunza | 39 | 40
---- Khusbakht | 41 | 42
---- Ermina | 43 | 44
-- Fadila | 46 | 53
---- Tahani | 47 | 48
---- Iffah | 49 | 50
---- Huwaydah | 51 | 52
-- Wafiyah | 54 | 61
---- Asheeyana | 55 | 56
---- Hutun | 57 | 58
---- Aakifah | 59 | 60
但是需要按这个顺序排序:
Chaman, Fadila, Kanval, Lamya, Qamar, Wafiyah
familyName | lft | rgt
------------------+-----+-----
Families | 1 | 62
--Chaman | 2 | 13
----Kanz | 3 | 4
----Varisha | 5 | 6
----Kunza | 7 | 8
----Khusbakht | 9 | 10
----Ermina | 11 | 12
--Fadila | 14 | 21
----Tahani | 15 | 16
----Iffah | 17 | 18
----Huwaydah | 19 | 20
--Kanval | 22 | 29
----Omera | 23 | 24
----Dafiyah | 25 | 26
----Daneen | 27 | 28
--Lamya | 30 | 43
----Banujah | 31 | 32
----Buthaynah | 33 | 34
----Vardah | 35 | 36
----Kaneez | 37 | 38
----Parveen | 39 | 40
----Ghunyah | 41 | 42
--Qamar | 44 | 53
----Deeba | 45 | 46
----Pakeezah | 47 | 48
----Rabiya | 49 | 50
----Banafsha | 51 | 52
--Wafiyah | 54 | 61
----Asheeyana | 55 | 56
----Hutun | 57 | 58
----Aakifah | 59 | 60
我有 Joe Celko 的 Trees and Hieracrchies in SQL for Smarties,它有一些移动节点的例子,比如将 Chaman 移动到前面。我还在网上找到了类似的示例,但我找不到任何可以对所有兄弟进行排序的 SQL 示例。
如何对兄弟姐妹进行排序?
有关我如何创建上述数据的详细信息...
我有一个将填充嵌套集的测试应用程序。所以我简单地创建了两次,一次是乱序的名称,第二次是为了显示所需的结果。至于实际从数据库中获取这些数据,我使用了这个查询:
SELECT COUNT(e1.ObjectId) AS LEVEL, e2.name, e2.lft, e2.rgt
FROM EventNode AS e1, EventNode AS e2
WHERE e2.lft BETWEEN e1.lft AND e1.rgt
GROUP BY e2.ObjectId
ORDER BY e2.lft
订购之所以重要,是因为订单将由最终用户控制。他们将能够以任何一种方式进行排序,并且还可以移动各个节点,以便兄弟姐妹按照他们想要的顺序显示。因此,树中的数据必须按正确的顺序排列,这一点很重要。
(PS 在真实数据中有一个 ObjectID,它是一个唯一标识符,它允许名称在嵌套集中重复)