我有一个这样的数据库表,大约有100万行:
id prev curr next
1 25 26 27
2 26 27 28
3 27 45 46
4 45 46 47
5 46 47 48
6 47 59 41
..............
..............
在java方面,我需要做的是,对于给定的输入,如 (curr = 45和diff = 2),我需要得到像45,27,26这样的项目列表。 对于输入(curr = 59和diff = 1),我需要得到59,47 如您所见,prev和next并不总是比curr值少1和1。
目前我在java中所做的是基于diff值,我在查询表中得到了curr的prev。 然后使用prev作为curr,我再次查询表并继续直到我得到我正在寻找的东西。但是对于更高的差异值,如20或30,这是太多的数据库调用。
有没有人想过在1个数据库查询中完成所有这些操作?由于表中的行太多,因此无法在本地获取和保存数据。
编辑回答评论:
答案 0 :(得分:1)
您可以自动加入表X次数(基于diff
的值,但如果您需要支持{{1}的大值,这可能不是一种非常有效的方法。 }}
这对我来说似乎是一个架构问题。如果没有进一步了解在写入数据库时如何分配项目的顺序,就很难就如何更改模式提供建议,以便更容易地进行读取查询。
答案 1 :(得分:0)
分层数据:curr的上一个流行趋势,因此 prev + of curr 是关系SQL中缺少的操作。
你可以创建一个prev + table作为(curr,prevplus,level),以便prev^level
给出prevplus。
填写这样的表格并不困难,甚至可以进行更改;在mysql中(因为自引用)带有临时表。
然后查询将与level <= 2
。
当然,表格普遍变大。
答案 2 :(得分:0)
我认为你可以通过两个db调用来实现这个目的:
SELECT id, curr, next FROM ...
应该仍然是相对少量的数据。
从那里,使用javascript diff#次循环数据,找到你需要的id。
然后:
SELECT * from ... WHERE id = {the record you need}