在查询之前和之后获取行

时间:2010-01-04 19:36:50

标签: sql mysql

我目前有这个查询

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

我正在添加一项新功能,可让您轻松导航到上一个或下一个项目。有没有一种简单的方法来修改上面的查询,以便它拉出前一行,当前行和下一行?或者只是做另一个查询会更容易吗?

5 个答案:

答案 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)

以下是您的应用应尝试维护的几个关键点:

  • 请勿加载超出必要的数据。(您不知道用户是否会使用prev / next行。)
  • 尽可能使用稳定的网址,确保网址正常。(网址不应表明您希望从#127行开始下一个3。)

记住这些目标,我建议点击“下一行”链接,页面会拉出下一行的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

但是,如果您的用户希望每次导航时都能看到上一个项目或下一个项目,那么您仍然会点击数据库以获取他们导航的任何方向的下一个项目。

我建议一次拉一页,然后在前端浏览它。