当一个帖子被访问时,我除了需要返回这个帖子的信息外,还需要返回前一个帖子(如果存在)和下一个帖子.

我想知道是否有一种方法可以在单个查询/ Select 中 Select MAX(id)MIN(id),并为它们传递一个条件.我正在try 用Laravel做的例子,我将用SQL编写它,以使它也更容易

-拉维尔-Laravel

$query = Post::query();
$query = $query->from('posts')->select(DB::raw('MAX(id), MIN(id)'))->whereRaw("id < {$id} and id > {$id}")->first();

SQL:好的,好的.

select MAX(id), MIN(id) from `posts` where id < 5 and id > 5 limit 1

Id变量是帖子的id值.在本例中,它的值为5.我正在执行的查询是获取引用此id的Max和Min,但我还需要获取用户访问的帖子的信息.

DB有编号为4和6的帖子.也就是说,在本例中,我需要从编号为4、5和6的帖子获取信息.

WHERE条件永远不会是true,但我不能使用or.第一个条件是MAX,第二个条件是MIN.如果我使用or,最大的id将来自DB.

我需要将最小值和最大值与一个值进行比较.也就是说,正如我上面解释的那样.如果id是5,我需要获取该值下面现有的最大id(),并且需要获取它上面的最小值.在我的例子中,根据我在数据库中的信息,它将是id4、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

编辑

Laravel equivalent, as shared by Gabriel Edu in the comment-section:

$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(); 

Mysql相关问答推荐

在Join的ON分句中使用SUM()

根据键的数量,SQL Json字段分为行

是否有一种方法可以 Select 表中具有特定列值的行,该行还显示phpmyadmin中原始表中的行号?

根据SQL中的平均范围对学生进行排名

MySQL全文索引和不区分大小写搜索带来的挑战

无法从mysql数据库获取数据

Mysql时间序列数据的最小值和最大值

go&mysql&docker 拒绝连接

基于关系的每个实体有一个真值和多个假值

创建表时我的 SQL 语句有什么问题

MYSQL REGEXP_REPLACE 在数字之后

无法通过迁移在现有表中插入行 - Rails 6

MySQL REGEXP 在没有 BINARY 模式的情况下区分大小写?

如何查询打印已售罄的产品? [MYSQL]

MySQL 中的 VARCHAR(255) 和 TINYTEXT 字符串类型有什么区别?

在mysql中复制没有数据的数据库 struct (带有空表)

MySQL使用phpmyadmin重新排列列的顺序

什么是mysql的BETWEEN性能超过..?

如何在执行 sql 脚本时 echo 打印语句

邮箱地址可接受的字段类型和大小?