我是这方面的新手,如果标题令人困惑,很抱歉。我正在构建一个简单的php/mysql库。当用户第一次访问它时,它将显示最新的25个条目,还允许在场外链接到列表中的单个条目。如果URL包含一个ID,javascript会滚动到它。但如果有25个以上的条目,我的查询可能会获取最新结果,但会省略URL中碰巧作为ID的旧条目。
这意味着我需要做这样的事情。。。
SELECT * FROM `submissions` WHERE uid='$sid'
但在成功找到带有特殊ID的提交后,也要做
SELECT * FROM `submissions` ORDER BY `id` DESC LIMIT 0, 25`
这样我就可以填充画廊的其余部分。
我可以查询该数据库两次,但我认为有一些巧妙的方法可以避免这种情况。MySQL还对所有内容进行排序(基于最新的、视图和其他变量),使用两个查询将打破这一局面。
您可以这样限制UNION:
(SELECT * FROM submissions WHERE uid = '$uid')
UNION
(SELECT * FROM submissions WHERE uid <> '$uid' ORDER BY `id` LIMIT 25)
LIMIT 25
注意,LIMIT
被列出了两次,因为在第一个查询返回结果的情况下,我们将在并集中有26个结果。这也会将"已搜索"项目放在返回的排序结果集中的第一位(其他24个结果按排序顺序显示)。如果不希望这样做,可以在并集中放置一个ORDER BY
,但如果它恰好是第26条记录,则搜索结果将被截断。
如果您需要25行并对所有行进行排序,我的猜测是,您需要采用两个查询的方法(根据第一个查询是否匹配,将第二个查询限制为24或25条记录),然后在显示之前将uid匹配的结果简单地插入到排序记录的适当位置。
我认为更好的解决方案是:
SELECT *
FROM `submissions`
order by (case when usid = $sid then 0 else 1 end),
id desc
limit 25
我认为union
不能保证按并集的顺序返回结果(在标准或其他数据库中没有保证)。