在 GoFrame ORM 中,可以使用 Union 和 UnionAll 方法执行 UNION 和 UNION ALL 操作,将两个或多个查询的结果合并为一个结果集。

Union 合并查询结果(去重)

Union 方法用于合并两个查询的结果,并去重相同的记录。
package main

import (
"fmt"
"github.com/gogf/gf/database/gdb"
"your_project/model"
)

func main() {
// 创建数据库连接
db := gdb.New()

// 第一个查询
query1 := db.Model(&model.User{}).
Fields("id, name, age").
Where("age > ?", 18).
OrderBy("age DESC").
Limit(5)

// 第二个查询
query2 := db.Model(&model.User{}).
Fields("id, name, age").
Where("name LIKE ?", "%John%").
OrderBy("id").
Limit(5)

// 合并两个查询结果(去重)
result, err := query1.Union(query2).All()

if err != nil {
fmt.Println("查询失败:", err)
return
}

// 处理查询结果
fmt.Println(result)
}

在上述代码中,我们使用 Union 方法将两个查询结果合并,并通过 Limit 方法限制返回的记录数量。Union 方法会去重相同的记录。

UnionAll 合并查询结果(不去重)

UnionAll 方法用于合并两个查询的结果,并保留所有记录,包括相同的记录。
package main

import (
"fmt"
"github.com/gogf/gf/database/gdb"
"your_project/model"
)

func main() {
// 创建数据库连接
db := gdb.New()

// 第一个查询
query1 := db.Model(&model.User{}).
Fields("id, name, age").
Where("age > ?", 18).
OrderBy("age DESC").
Limit(5)

// 第二个查询
query2 := db.Model(&model.User{}).
Fields("id, name, age").
Where("name LIKE ?", "%John%").
OrderBy("id").
Limit(5)

// 合并两个查询结果(不去重)
result, err := query1.UnionAll(query2).All()

if err != nil {
fmt.Println("查询失败:", err)
return
}

// 处理查询结果
fmt.Println(result)
}

在上述代码中,我们使用 UnionAll 方法将两个查询结果合并,并通过 Limit 方法限制返回的记录数量。UnionAll 方法会保留所有记录,包括相同的记录。

这些方法可以根据实际需求在查询中进行多个结果集的合并操作,使得数据处理更为灵活。


转载请注明出处:http://www.pingtaimeng.com/article/detail/7641/GoFrame