使用某些参数选择下一个和上一个ID

时间:2013-10-23 23:41:31

标签: 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

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

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

编辑:改写了一下

1 个答案:

答案 0 :(得分:1)

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

  • 中间的图片符合你的身份。
  • 上一张图片符合你的条件PLUS它的id更低,BUT是最高的id,来自表格的下半部分。
  • 下一张图片符合你的条件PLUS它的id更高,BUT是最低的id,来自表格的上半部分。

选中此项(注释ID 2会被跳过,因为它与" id =相册或相册= null"禁止匹配。):

看到这个小提琴: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

限制&#34;鞋帮&#34;部分和&#34;降低&#34; 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