2010-01-04 58 views
0

后,我现在有这个疑问获取前行,并查询

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 

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

+1

要么取消该限制,或增加行数会返回 – 2010-01-04 19:40:48

回答

4

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

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

你可以尝试拉多行(即结果的页面)与初始查询,然后通过在前端数据进行导航。如果您需要从数据库获得即时准确的数据,除了执行其他查询之外,我没有看到任何其他方法。

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 

但是,如果你的用户会希望看到前一个项目或下一个项目每次浏览时间,那么你还是会击中数据库以获取他们正在导航的任何方向的下一个项目。

我会建议在同一时间拉页,并通过它在前端导航来代替。

1

这里有几个关键点您的应用程序应该尽量保持:

  • 不要加载更多数据超过必要。(你不知道,如果用户将使用上/下一个行或不行。)
  • 让网址理智,使用的稳定网址,只要有可能。(网址不应表明您想成为下一个3从列#127)

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

1

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

你可以考虑让NEXT_ID和previous_id作为字段的信息,然后

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客户端,但希望这将指向你在一个很好的方向。)