Sql 获取查询前后的行

Sql 获取查询前后的行,sql,mysql,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, me

我目前有这个问题

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

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

您可以尝试使用初始查询提取多行,即一页结果,然后在前端导航该数据。如果您需要从数据库中获得即时准确的数据,我认为除了执行额外的查询之外没有其他方法。

您可以尝试使用初始查询提取多行,即一页结果,然后在前端导航该数据。如果您需要从数据库中获取最新的精确数据,我认为除了执行额外的查询之外,没有其他方法。

您可以使用union来获取上一行和下一行:

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
但是,如果您的用户每次导航时都希望看到上一个项目或下一个项目,那么您仍然要点击数据库以获取下一个项目,无论他们在哪个方向导航


我建议您一次拖动一个页面,然后在前端导航。

您可以使用联合来获取上一行和下一行:

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
但是,如果您的用户每次导航时都希望看到上一个项目或下一个项目,那么您仍然要点击数据库以获取下一个项目,无论他们在哪个方向导航


我建议您一次拖动一个页面,然后在前端导航。

您可以使用子查询来获取上一条记录和下一条记录的id:

...
where media.id in (
  '$id',
  (select max(id) from media where id < '$id'),
  (select min(id) from media where id > '$id')
)
...

您可以使用子查询获取上一条记录和下一条记录的id:

...
where media.id in (
  '$id',
  (select max(id) from media where id < '$id'),
  (select min(id) from media where id > '$id')
)
...

以下是您的应用程序应努力维护的几个关键点:

不要加载过多的数据。您不知道用户是否将使用上一行/下一行。 尽可能使用稳定的URL,使URL健全。URL不应表示您希望成为第127行的下一个3。 记住这些目标,我建议在单击下一行链接时,页面提取下一行的ID,然后重定向到该行的永久链接。例如:

http://example.com/media/1337/prev 应运行:

SELECT id FROM media WHERE media.id < 1337 ORDER BY media.id DESC LIMIT 1
SELECT id FROM media WHERE media.id > 1337 ORDER BY media.id ASC LIMIT 1

然后重定向到,大概,http://example.com/media/1338.

以下是应用程序应努力维护的几个关键点:

不要加载过多的数据。您不知道用户是否将使用上一行/下一行。 尽可能使用稳定的URL,使URL健全。URL不应表示您希望成为第127行的下一个3。 记住这些目标,我建议在单击下一行链接时,页面提取下一行的ID,然后重定向到该行的永久链接。例如:

http://example.com/media/1337/prev 应运行:

SELECT id FROM media WHERE media.id < 1337 ORDER BY media.id DESC LIMIT 1
SELECT id FROM media WHERE media.id > 1337 ORDER BY media.id ASC LIMIT 1

然后重定向到,大概,http://example.com/media/1338.

您真的想要数据库中的下一行吗?您的数据是否在info.id上建立索引?如果不是,您的下一行可能不是您期望的项目。如果您需要更改项目的顺序,您会怎么做

你可以考虑在信息上使用NExtID和PrimouSuiID作为字段,然后考虑< /P>

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客户端。但希望它能为您指明一个好的方向

您真的想要数据库中的下一行吗?您的数据是否在info.id上建立索引?如果不是,您的下一行可能不是您期望的项目。如果您需要更改项目的顺序,您会怎么做

你可以考虑在信息上使用NExtID和PrimouSuiID作为字段,然后考虑< /P>

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客户端。但希望它能为您指明一个好的方向

要么取消限制,要么增加它将返回的行数要么取消限制,要么增加它将返回的行数