## 高級查詢
這里把幾個高級查詢單獨列出來
## Chunk 數據分片 大量數據批量處理 (累積處理)
```go
` 當需要操作大量數據的時候, 一次性取出再操作, 不太合理, 就可以使用chunk方法
chunk的第一個參數是指定一次操作的數據量, 根據業務量, 取100條或者1000條都可以
chunk的第二個參數是一個回調方法, 用于書寫正常的數據處理邏輯
目的是做到, 無感知處理大量數據
實現原理是, 每一次操作, 自動記錄當前的操作位置, 下一次重復取數據的時候, 從當前位置開始取
`
User := db.Table("users")
User.Fields("id, name").Where("id",">",2).Chunk(2, func(data []map[string]interface{}) {
// for _,item := range data {
// fmt.Println(item)
// }
fmt.Println(data)
})
// 打印結果:
// map[id:3 name:gorose]
// map[id:4 name:fizzday]
// map[id:5 name:fizz3]
// map[id:6 name:gohouse]
[map[id:3 name:gorose] map[name:fizzday id:4]]
[map[id:5 name:fizz3] map[id:6 name:gohouse]]
```
## Loop 數據分片 大量數據批量處理 (從頭處理)
```go
` 類似 chunk 方法, 實現原理是, 每一次操作, 都是從頭開始取數據
原因: 當我們更改數據時, 更改的結果可能作為where條件會影響我們取數據的結果,所以, 可以使用Loop`
User := db.Table("users")
User.Fields("id, name").Where("id",">",2).Loop(2, func(data []map[string]interface{}) {
// for _,item := range data {
// fmt.Println(item)
// }
// 這里執行update / delete 等操作
})
```
## 嵌套where
```go
// SELECT * FROM users
// WHERE id > 1
// and ( name = 'fizz'
// or ( name = 'fizz2'
// and ( name = 'fizz3' or website like 'fizzday%')
// )
// )
// and job = 'it' LIMIT 1
User := db.Table("users")
User.Where("id", ">", 1).Where(func() {
User.Where("name", "fizz").OrWhere(func() {
User.Where("name", "fizz2").Where(func() {
User.Where("name", "fizz3").OrWhere("website", "like", "fizzday%")
})
})
}).Where("job", "it").First()
```
##