0

我是新手,如果标题令人困惑,对不起。我正在构建一个简单的 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 还对所有内容进行排序(基于最新的、视图和其他变量),并且使用两个查询会破坏这一点。

4

2 回答 2

2

您可以像这样限制 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 - 匹配的结果在显示之前放入适当位置的排序记录。

于 2013-02-19T22:07:42.953 回答
0

我认为更好的解决方案是:

SELECT *
FROM `submissions`
order by (case when usid = $sid then 0 else 1 end),
         id desc
limit 25

我认为不能union保证按联合的顺序返回结果(标准或其他数据库中没有保证)。

于 2013-02-19T22:19:34.790 回答