【发布时间】:2011-02-10 14:52:03
【问题描述】:
我尝试将消息树存储为 MySQL 上的闭包表。主要是从 Bill Karwin 的演讲 Models for hierarchical data 中了解到这种方法。问题是:我想找到不同的 3 个根节点(= 没有祖先的节点),它们的树中有最新的节点。注意!即使某个根节点的子树中有 10 个最新节点,它也只会计算一次。
所有节点都有其修改时间,为简单起见,我们可以说节点 id 也代表它们最后一次修改的时间(但我们不能在查询中使用 id 作为时间),第一个是第一个,最后一个是第 17 个。
1
2
8
15
16
17
7
3
4
5
6
9
12
10
14
11
13
在闭包表中,我有 3 列(祖先、后代、深度),因此树的呈现方式如下:
| ancestor | descendant | depth |
+----------+------------+-------+
| 1 | 1 | 0 |
| 1 | 2 | 1 |
| 1 | 7 | 1 |
| 1 | 8 | 2 |
| 1 | 15 | 3 |
| 1 | 16 | 3 |
| 1 | 17 | 2 |
| 2 | 2 | 0 |
| 2 | 8 | 1 |
| 2 | 15 | 2 |
| 2 | 16 | 2 |
| 2 | 17 | 1 |
| 3 | 3 | 0 |
| 3 | 4 | 1 |
| 3 | 5 | 2 |
| 3 | 6 | 1 |
| 4 | 4 | 0 |
| 4 | 5 | 1 |
| 5 | 5 | 0 |
| 6 | 6 | 0 |
| 7 | 7 | 0 |
| 8 | 8 | 0 |
| 8 | 15 | 1 |
| 8 | 16 | 1 |
| 9 | 9 | 0 |
| 9 | 12 | 1 |
| 10 | 10 | 0 |
| 10 | 14 | 1 |
| 11 | 11 | 0 |
| 11 | 13 | 1 |
| 12 | 12 | 0 |
| 13 | 13 | 0 |
| 14 | 14 | 0 |
| 15 | 15 | 0 |
| 16 | 16 | 0 |
| 17 | 17 | 0 |
我可以得到这样的最新子树:
SELECT c.ancestor, MAX(time) AS t
FROM closure c
JOIN nodes n ON (c.descendant = n.node AND c.ancestor <> n.node)
GROUP BY c.ancestor ORDER BY t desc;
但是我怎样才能获得具有最新帖子的不同 3 个 root 节点(在这种情况下为 1、10 和 11)?一个查询是否可能(并且合理)?
【问题讨论】:
-
你能给出节点表的示例数据吗?
标签: sql tree hierarchical-data