我有一个看起来像这样的表(省略了非重要的列
`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
以红色标记的列是我想要选择的,以绿色标记的列是我拥有的picture_id,并且想要找到下一个/上一个ID。注意,它跳过picture_ids 2< 9因为它的album_id不等于其picture_id,它跳过picture_id 11,因为它未经过身份验证/批准。
我如何实现这一目标?我一无所知。
编辑:改写了一下
答案 0 :(得分:1)
您可以使用简单的联合查询,其中考虑以下因素:
选中此项(注释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