对两者中的每一个进行最大和最小传递条件的选择

Gab*_*Edu 6 mysql sql laravel

当访问一篇帖子时,除了返回该帖子的信息之外,我还需要返回上一篇(如果存在)和下一篇。

我想知道是否有一种方法可以在单个查询/选择中进行选择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

是否可以通过一次咨询完成,还是我真的需要进行多次咨询?

Laj*_*pad 7

是的,你可以这样做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)