我有一个包含多行的表,其中有一列用于对这些行进行排序。然后我有一个过期的列和一个数据列:
|ordering| expired | data |
------------------------------
| 1 |2020-12-31|whatever|
| 2 |2020-12-31|whatever|
| 3 |2020-12-31|whatever|
| 4 |2010-01-01|whatever|
| 5 |2020-12-31|whatever|
我还有一张表格,其中包含我上次获得的行号:
|number|
|------|
| 2 |
我得到那个数字并加1以获得我需要的下一行。然后我检查该数字是否高于rowcount,如果是,则返回1。我将新行存储回数字,以便下次需要一行时可以使用它。
这是完美的工作,除了我过期的结果过滤。在上面的示例中,将不会选择第4行。因此,当我得到order = 4的行时,结果将为空。当然很容易修复 - 如果我得到一个空的结果,我可以尝试下一个值。如果存在大量过期行,则需要额外的时间和大量的额外时间。
如果我以前遇到的一行恰好在两次通话之间过期,我还需要注意我不会松开一行。
当行不断变化时,迭代行的最有效方法是什么?
答案 0 :(得分:1)
运行查询两次可能是最好的方法。但是,您也可以订购所有结果,从数字后面的第一个值开始,包围:
order by (case when t1.ordering > t2.number then 1 else 2 end),
t1.ordering
如果你有10行,那么这很好。如果您有10,000,则会产生排序所有数据的开销,并且两个查询可能更快。
答案 1 :(得分:0)
您可以使用$('#table1 tbody').sortable({
revert: true,
start: function(event, ui) {
// get row number, such as (row) 1
},
stop: function(event, ui) {
// get row number, such as (row) 3
}});
执行查询:
Min(ordering)
如果SELECT @nextOrderingNum = Coalesce(Min(t1.ordering), 0)
FROM table1 t1
WHERE t1.expired > GETDATE()
AND t1.ordering > @prevOrderingNum;
为0设置@nextOrderingNum
= @prevOrderingNum
并再次运行。
编辑,甚至更好,而不是只运行两次,只需向@nextOrderingNum
添加子查询:
Coalesce