我目前有这个查询
SELECT short_url,
type,
file_thumbnail,
file_embed,
media.id,
user,
media.file_url,
votes,
comments,
GROUP_CONCAT(info.itemTime) AS time,
info.title,
media.time AS oldTime,
media.title,
info.topic,
GROUP_CONCAT(votes) AS totalVotes,
GROUP_CONCAT(votes) AS listVotes,
GROUP_CONCAT(comments) AS listComments,
GROUP_CONCAT(url) AS listSites
from info JOIN
media on info.mid=media.id
WHERE media.id='$id'
GROUP BY mid
ORDER BY media.id DESC
LIMIT 0,1
我正在添加一项新功能,可让您轻松导航到上一个或下一个项目。有没有一种简单的方法来修改上面的查询,以便它拉出前一行,当前行和下一行?或者只是做另一个查询会更容易吗?
答案 0 :(得分:4)
您可以使用子查询来获取上一条和下一条记录的ID:
...
where media.id in (
'$id',
(select max(id) from media where id < '$id'),
(select min(id) from media where id > '$id')
)
...
答案 1 :(得分:1)
以下是您的应用应尝试维护的几个关键点:
记住这些目标,我建议点击“下一行”链接,页面会拉出下一行的ID,然后重定向到该行的永久链接。所以,例如:
http://example.com/media/1337/prev
应该运行:
SELECT id FROM media WHERE media.id < 1337 ORDER BY media.id DESC LIMIT 1
然后重定向到http://example.com/media/1336
。
http://example.com/media/1337/next
应该运行:
SELECT id FROM media WHERE media.id > 1337 ORDER BY media.id ASC LIMIT 1
然后重定向到http://example.com/media/1338
。
答案 2 :(得分:1)
您真的想要数据库中的下一行吗?你的数据是否在info.id上编入索引?如果不是,您的下一行可能不是您期望的项目。如果您需要更改项目的顺序,该怎么办?
您可以考虑将next_id和previous_id作为info上的字段,然后
SELECT
...
FROM info current_info
INNER JOIN media current_media
ON current_info.id = current_media.id
INNER JOIN info prev_info
ON prev_info.id = current_info.previous_id
INNER JOIN media prev_media
ON prev_info.id = prev_media.id
INNER JOIN info next_info
ON next_info.id = current_info.next_id
INNER JOIN media next_media
ON next_info.id = next_media.id
WHERE current_media.id = '$id'
这具有始终返回单行的优点。为什么那么好?如果没有先前或没有下一个如何判断你的两个返回的行是先前的还是当前的,还是当前的和下一个的。
它也更易于管理,因为您可以通过更改其兄弟ID来重新排序项目。
(警告:上面的代码可能不起作用,我的笔记本电脑上没有sql客户端。但希望它会指向你一个好的方向)
答案 3 :(得分:0)
您可以尝试使用初始查询拉出多行(即一页结果),然后在前端导航该数据。如果您需要从数据库获得最新的准确数据,除了进行额外的查询之外,我没有看到任何其他方式。
答案 4 :(得分:0)
您可以使用联合来获取上一行和下一行:
SELECT
...
FROM info
INNER JOIN media
ON info.mid = media.id
WHERE media.id < '$id'
GROUP BY mid
ORDER BY media.id DESC
UNION ALL
SELECT
...
FROM info
INNER JOIN media
ON info.mid = media.id
WHERE media.id = '$id'
GROUP BY mid
ORDER BY media.id DESC
UNION ALL
SELECT
...
FROM info
INNER JOIN media
ON info.mid = media.id
WHERE media.id > '$id'
GROUP BY mid
ORDER BY media.id ASC
但是,如果您的用户希望每次导航时都能看到上一个项目或下一个项目,那么您仍然会点击数据库以获取他们导航的任何方向的下一个项目。
我建议一次拉一页,然后在前端浏览它。