我有一个看起来像这样的表格(省略了不重要的列
`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,想要找到下一个/上一个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/