Postgresql+gorm复杂的分组分页



我有一个带有GroupId列的表,可能有大量的行。有没有办法让数据按组分页?例如,先得到10组,然后再得到10组等等?

表将具有这种结构(默认情况下不排序(-很抱歉格式不正确,由于某种原因它不起作用,但我认为它是可见的

Col1 Col2 GroupId
数据A foo1 1
数据B foo2 1
数据C foo3 2

它实际上并不像您只是通过有界标识符(GroupId(查询数据那样分页。如果你知道你的组ID,并且它们是连续的,那么你可以做这样的事情。这是使用纯Go完成的,你可以很容易地将gorm与此结合起来。

去游乐场

package main
import (
"fmt"
)
func main() {
for _, q := range queries() {
fmt.Println(q)
}
}
func queries() (out []string) {
groups := []int{10, 20, 30, 40, 50, 60, 70, 80, 90, 100}
for i := 0; i < len(groups); i++ {
var lower, upper int = 0, 0
if i != 0 {
lower = groups[i-1]
}
upper = groups[i]
q := fmt.Sprintf("SELECT * FROM MyTable WHERE GroupId >= %v AND GroupId < %v", lower, upper)
out = append(out, q)
}
return
}

queries的调用会打印出应该运行的每个查询,以获得每个组中的所有结果。例如:

SELECT * FROM MyTable WHERE GroupId >= 0 AND GroupId < 10
SELECT * FROM MyTable WHERE GroupId >= 10 AND GroupId < 20
SELECT * FROM MyTable WHERE GroupId >= 20 AND GroupId < 30
SELECT * FROM MyTable WHERE GroupId >= 30 AND GroupId < 40
SELECT * FROM MyTable WHERE GroupId >= 40 AND GroupId < 50
SELECT * FROM MyTable WHERE GroupId >= 50 AND GroupId < 60
SELECT * FROM MyTable WHERE GroupId >= 60 AND GroupId < 70
SELECT * FROM MyTable WHERE GroupId >= 70 AND GroupId < 80
SELECT * FROM MyTable WHERE GroupId >= 80 AND GroupId < 90
SELECT * FROM MyTable WHERE GroupId >= 90 AND GroupId < 100

到目前为止,我们已经假设您已经确切地知道要查询的"组存储桶"。相反,如果我们假设我们知道有多少个连续的组(n(和每个查询需要多少个组(存储桶大小s(,我们可以很容易地创建一个函数,为我们提供我们应该查询的存储桶。

去游乐场

func groups(n, s int) (out []int) {
for i := 0; i <= n; i++ {
if i == 0 {
continue
}
if i%s == 0 || i == n {
out = append(out, i)
}
}
return
}

最新更新