mysql - 使用特定参数选择下一个和上一个 id

标签 mysql sql

我有一个看起来像这样的表格(省略了不重要的列

`pictures` (
  `picture_id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `picture_title` varchar(255) NOT NULL,
  `album_id` int(10) unsigned DEFAULT NULL,
  `authenticated` tinyint(4) DEFAULT '0',
  `approved` tinyint(4) DEFAULT '0'
)

我想要做的是获取下一个和上一个经过身份验证和批准的 picture_id。但有一个问题 - 该事件必须具有 picture_id = album_idalbum_id IS NULL

这是一张图片,可以更轻松地描述我想要实现的目标。 http://i.imgur.com/xTaEhwt.png

标记为红色的列是我要选择的列,标记为绿色的列是我拥有的图片ID,想要找到下一个/上一个ID。请注意,它会跳过 picture_id 2 < 9,因为它的 album_id 不等于其 picture_id,并且会跳过 picture_id 11,因为它未经身份验证/批准。

我该如何实现这一目标?我一无所知。

编辑:稍作修改

最佳答案

您可以使用简单的联合查询,其中考虑以下因素:

  • 中间的图片与您的 ID 匹配。
  • 上一张图片符合您的条件,而且其 ID 较低,但是表格下部的最高 ID。
  • 下一张图片符合您的条件,而且其 ID 较高,但是表格上部的最低 ID。

检查此项(注意 id 2 被跳过,因为它与“id=album 或 album=null”约束不匹配。):

看到这个 fiddle :http://sqlfiddle.com/#!2/42ce6/17

  (SELECT 
    * 
  FROM 
    pics
  WHERE
    id = 10
  ) -- target id image
UNION
  (
  SELECT 
    * 
  FROM 
    pics
  WHERE
    id < 10 AND
    authenticated = 1 AND
    approved = 1 AND
    (id = album OR ISNULL(album))
  ORDER BY id DESC LIMIT 0,1
  ) -- highest id of lower part
UNION
  (
  SELECT 
    * 
  FROM 
    pics
  WHERE
    id > 10 AND
    authenticated = 1 AND
    approved = 1 AND
    (id = album OR ISNULL(album))
  ORDER BY id ASC LIMIT 0,1
  ) -- loweste id of upper part
  ORDER BY id

将表格的“上”部分和“下”部分限制为 1 与您要获取的 2 个条目完全匹配。

输出:

ID  TITLE   ALBUM   AUTHENTICATED   APPROVED
1   My fav  1   1   1
10  test 2  (null)  1   1
12  Holiday pictures    (null)  1   1

关于mysql - 使用特定参数选择下一个和上一个 id,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19554333/

相关文章:

MySQL更新列+1?

mysql - 需要帮助来构建 sql 查询

sql - 来自重叠间隔的 Oracle 时间线报告

PHP 脚本混淆 GEO Lite DB

mysql - 无法正确连接 3 个表

mysql - Grails 3 urlMappingsReport 失败

javascript - null 检查运行 SQL 查询的 where 子句

sql - 直接执行语句和从存储过程执行语句时的执行计划不同

mysql - 如何在查询中使用 if 条件?

mysql - 将多个结果与条件结合起来