我想为每个分类的行添加计数,但在分页时,每页的计数都从0开始,这与常规查询不同。常规查询时工作正常。
例如,我有以下表格:
```
id | category_id | item_id | created_at
---|-------------|---------|------------
7 | 11 | 106 | 2024-05-06
6 | 3 | 102 | 2024-05-06
5 | 11 | 101 | 2024-05-05
4 | 9 | 98 | 2024-05-04
3 | 3 | 97 | 2024-05-03
2 | 1 | 91 | 2024-05-02
1 | 11 | 89 | 2024-05-01
```
我想根据创建日期计算`item_id`在其分类中的顺序。
为此,我使用了以下查询:
```sql
DB::('table')->select(
table.*,
DB::raw('ROW_NUMBER() OVER(PARTITION BY category_id ORDER BY created_at) as order')
)->get();
```
这与以下原始查询相同:
```sql
SELECT table.*, ROW_NUMBER() OVER(PARTITION BY category_id ORDER BY created_at) as order
FROM table
```
结果如下:
```
id | category_id | item_id | created_at | order
---|-------------|---------|------------|-------
7 | 11 | 106 | 2024-05-06 | 3
6 | 3 | 102 | 2024-05-06 | 2
5 | 11 | 101 | 2024-05-05 | 2
4 | 9 | 98 | 2024-05-04 | 1
3 | 3 | 97 | 2024-05-03 | 1
2 | 1 | 91 | 2024-05-02 | 1
1 | 11 | 89 | 2024-05-01 | 1
```
但这在分页时不起作用,因为每页都有自己的子集,计数从另一行开始。例如,如果我把上面的表格每4个结果分页,最终得到2页,那么第2页的结果将是:
```
id | category_id | item_id | created_at | order
---|-------------|---------|------------|-------
7 | 11 | 106 | 2024-05-06 | 2
6 | 3 | 102 | 2024-05-06 | 1
5 | 11 | 101 | 2024-05-05 | 1
```
但我希望它是:
```
id | category_id | item_id | created_at | order
---|-------------|---------|------------|-------
7 | 11 | 106 | 2024-05-06 | 3
6 | 3 | 102 | 2024-05-06 | 2
5 | 11 | 101 | 2024-05-05 | 2
```
我该怎么做呢?
由于使用
->paginate()
方法进行分页在后台使用LIMIT
和OFFSET
,我认为你可能无法这样做。然而,如果你不介意先获取所有结果,然后通过分页只返回它们的一个子集,那么你应该能够做到。
缓存查询结果也会有帮助。