按特殊顺序对表记录进行排序

时间:2012-12-21 11:14:23

标签: mysql sql hibernate

我有桌子:

+----+--------+----------+
| id | doc_id | next_req | 
+----+--------+----------+
|  1 |    1   |     4    | 
|  2 |    1   |     3    | 
|  3 |    1   |     0    | 
|  4 |    1   |     2    | 
+----+--------+----------+

id - auto incerement主键。

nex_req - 表示记录顺序。 (记录的 next_req = id

如何构建SQL查询以此顺序获取记录:

+----+--------+----------+
| id | doc_id | next_req | 
+----+--------+----------+
|  1 |    1   |     4    | 
|  4 |    1   |     2    | 
|  2 |    1   |     3    | 
|  3 |    1   |     0    | 
+----+--------+----------+

说明:

record1 with id=1 and next_req=4 means: next must be record4 with id=4 and next_req=2
record4 with id=5 and next_req=2 means: next must be record2 with id=2 and next_req=3 
record2 with id=2 and next_req=3 means: next must be record3 with id=1 and next_req=0 
record3 with id=3 and next_req=0: means that this is a last record 

我需要在表格中存储记录顺序。这对我很重要。

3 个答案:

答案 0 :(得分:1)

如果可以,请更改表格格式。不是命名下一条记录,而是按顺序标记记录,以便您可以使用自然的SQL排序:

+----+--------+------+
| id | doc_id | sort | 
+----+--------+------+
|  1 |    1   |  1   | 
|  4 |    1   |  2   | 
|  2 |    1   |  3   | 
|  3 |    1   |  4   | 
+----+--------+------+

然后你甚至可以在doc_id上进行集群索引,如果你需要解决性能问题,可以进行排序。老实说,如果你需要重新排序行,那么它就不像你正在使用的链接列表那样工作了。

答案 1 :(得分:0)

能够在Oracle中为您提供解决方案,

select id,doc_id,next_req from table2 
start with id = 
(select id from table2 where rowid=(select min(rowid) from table2))
connect by prior next_req=id

fiddle_demo

答案 2 :(得分:0)

我建议修改你的表并添加另一列OrderNumber,所以最终这个列很容易订购。

虽然这种方法可能存在问题:

1)您有现有表,需要设置OrderNumber列值。我想这部分很简单。您只需设置初始零值并添加CURSOR,例如移动记录并递增订单编号值。

2)当您的表中出现新行时,您必须修改OrderNumber,但这取决于您的具体情况。如果您只需要将项目添加到列表的末尾,那么您可以将新值设置为MAX + 1.在另一种情况下,您可以尝试在插入新项目时编写TRIGGER并调用类似步骤1)。这可能会导致性能受到很大影响,因此您必须仔细研究您的体系结构,并修改这种不寻常的结构。