mysql - 选择一行及其下一行和上一行

标签 mysql optimization

情况:

目前我有 3 个问题:

  1. First - 通过id获取排序位置的数据;
  2. 其次 - 通过position-1获取数据;
  3. 第三 - 按位置+1 获取数据。

我只想有 1 个查询,如果它们存在,则可以通过 id + 上一个和下一个查询获取“需要的一个”。

查询:

首先

set @position = 0;

SELECT 
`position` FROM
(
  SELECT `id`, @position:=@position+1 as `position` FROM {#table}          
  "other_part_of_query"
  ORDER BY `modified_time` DESC
) t
WHERE 
t.id = '".id."' 
LIMIT 1

第二个和第三个

set @position = 0;

SELECT 
`id` FROM
(
  SELECT `id`, @position:=@position+1 as `position` FROM {#table}          
  "other_part_of_query"
  ORDER BY `modified_time` DESC
) t
WHERE 
t.`position` = '".position."' 
LIMIT 1

最佳答案

这很复杂,因为您是通过 id 选择一行,但通过另一个字段 modified_time 选择相邻的行。

想法是使用变量来枚举行。并且,使用另一行来计算您关心的 id 的值。在子查询中执行此操作,然后选择所需的行:

SELECT t.*
FROM (SELECT `id`,
              @rn := if(@rnid := if(t.id  = '".id."', @rn + 1, @rnid),
                        @rn + 1, @rn + 1
                       ) as rn
      FROM {#table} t       
           "other_part_of_query" cross join
           (select @rn := 0, @rnid := 0) vars
      ORDER BY `modified_time` DESC
     ) t
WHERE rn in (@rnid - 1, @rnid, @rn)

关于mysql - 选择一行及其下一行和上一行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28966667/

相关文章:

c++ - 优化迭代器定义

Mysql复杂数据问题

php - 在 php5 中使用内联字符串与连接的速度差异?

mysql - 加速大表上的简单 UPDATE 查询

javascript - 未使用的 css - 你如何清理它?

PHP - MySQL 请求 - 未找到数据

mysql - 不使用 auto_increment id 的 Sphinx

mysql - Impala 正则表达式在管道分隔列表中查找 "2"但不是 "255"

mysql - 用mysql检查是否没有结果

python - 替换嵌套的 for 循环和列表理解的值分配