当访问一篇帖子时,除了返回该帖子的信息之外,我还需要返回上一篇(如果存在)和下一篇。
我想知道是否有一种方法可以在单个查询/选择中进行选择MAX(id),MIN(id)并为每个查询/选择传递一个条件。我试图在 Laravel 中做的示例,我将用 SQL 编写它以使其也更容易
拉拉维尔:
$query = Post::query();
$query = $query->from('posts')->select(DB::raw('MAX(id), MIN(id)'))->whereRaw("id < {$id} and id > {$id}")->first();
Run Code Online (Sandbox Code Playgroud)
SQL:
select MAX(id), MIN(id) from `posts` where id < 5 and id > 5 limit 1
Run Code Online (Sandbox Code Playgroud)
id 变量是帖子 id 值。在此示例中,它的值为 5。我正在执行的查询是获取引用此 id 的 MAX 和 MIN,但我还需要获取用户访问的帖子的信息。
数据库的帖子ID号为4和6。也就是说,在本例中我需要从帖子编号4、5和6中获取信息。
where 条件永远不会是true,但我无法使用or。第一个条件是MAX,第二个条件是MIN。如果我使用or,最大的 id 将来自数据库。
我需要获得与某个值相比的最小值和最大值。也就是说,正如我上面所解释的。如果 id 是 5,我需要获取低于该值的最大现有 id() ,并且需要获取高于该值的最小值。就我而言,根据数据库中的信息,id 为 4、5 和 6
是否可以通过一次咨询完成,还是我真的需要进行多次咨询?
是的,你可以这样做case-when
select MAX(
CASE
WHEN id < 5 THEN id
ELSE NULL
END
), MIN(
CASE
WHEN id > 5 THEN id
ELSE NULL
END
)
from `posts`
where id <> 5
Run Code Online (Sandbox Code Playgroud)
编辑
Laravel 等效项,由 Gabriel Edu 在评论部分分享:
$query = Post::query();
$query = $query->from('posts')->
select(DB::raw("MAX(CASE WHEN id < {$id} THEN id ELSE null END), MIN(CASE WHEN id > {$id} THEN id ELSE null END)"))->first();
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
403 次 |
| 最近记录: |