0

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

`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_id要么album_id IS NULL.

这是一张更容易描述我想要实现的目标的图像。http://i.imgur.com/xTaEhwt.png

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

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

编辑:改写了一下

4

1 回答 1

1

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

  • 中间的图片与您的身份证相符。
  • 前面的图片符合您的条件,加上它的 id 较低,但从表的下部开始,它是最高的 id。
  • 下一张图片与您的条件相匹配,加上它的 id 更高,但从表格的上部开始,它是最低的 id。

检查这一点(注意 id2被跳过,因为它与“id=album or album=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

限制表格的“上”部分和“下”部分以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
于 2013-10-24T00:01:50.513 回答