我在数据库的最新10个之后显示了前10个最新和最后10个最早的主题。我能够在前10个主题中显示我需要的内容。我的问题是,当我在数据库中有21个主题时,最后10个主题根据我的需要显示,但是当我只有20个主题时,最后一个主题在最新的将仍然是最古老的。为了使它更清楚,这是一个参考图片。
- 当我在数据库中有21个或更多主题时会发生这种情况 -
- 当我在数据库中有20个主题时会发生这种情况 -
我不希望像我有20个主题时那样重复一个话题。 这是我从数据库中获取最后10个主题的代码:
// fetching last 10 topics from forum
function history() {
$sql = "SELECT * FROM (
SELECT f_id AS id, f_title AS name,f_dept AS dept,f_last_view AS last_view
FROM forum
ORDER BY last_view ASC
LIMIT 10 OFFSET 1
) AS `table` ORDER by last_view DESC ";
//-run the query against the mysql query function
$result=mysql_query($sql) or die(mysql_error());
$history = array();
//-create while loop and loop through result set
while (($row = mysql_fetch_assoc($result)) !== false){
$history[] = array(
'id' => $row['id'],
'name' => $row['name'],
'dept' => $row['dept'],
'last_view' => $row['last_view'],
);
}
return $history;
}
P.S。我知道mysql_ *已被弃用但请耐心等待。提前谢谢
答案 0 :(得分:3)
你的问题有点不清楚 - 你想要最新的10(你工作过)和最老的10吗?或最新的10和下一个最新的10?
我假设你的意思是最新的10和下一个最新的10。
您的问题似乎是了解sql中的offset关键字。偏移导致跳过该数量的结果。
基于此,您当前正按照最后一个视图(我将假设是某种形式的时间戳)对结果进行排序 - 从最旧到最新,然后从第二个开始挑选其中的10个。
如果您想要的是第11-20个最新结果,请尝试
ORDER BY last_view DESC
LIMIT 10 OFFSET 10
在您的查询中。
另请参阅this stackoverflow question并提供更详细的答案
答案 1 :(得分:2)
您的问题中提出了两个问题。第一个是查询的简单技术问题:
SELECT f_id AS id, f_title AS name,f_dept AS dept,f_last_view AS last_view
FROM forum
ORDER BY last_view ASC
LIMIT 10 OFFSET 1
由于您使用OFFSET 1
,将返回11个最旧的条目减去最旧的条目。要获得最早的10个,请使用:
SELECT f_id AS id, f_title AS name,f_dept AS dept,f_last_view AS last_view
FROM forum
ORDER BY last_view ASC
LIMIT 10
如果您想要正确使用OFFSET
,例如,您将使用下一个10(如果您有,例如,100个条目并想输出条目81-90):< / p>
SELECT f_id AS id, f_title AS name,f_dept AS dept,f_last_view AS last_view
FROM forum
ORDER BY last_view ASC
LIMIT 10 OFFSET 10
你提出的第二个问题是不想要最老的&#34;列表已经输入了&#34;最新的&#34;列表,只有在表中总共有19个或更少的条目时才会出现(如果两个列表都有10个条目)。所以如果你有15个条目,你会想要:
最早的名单为:
为避免重叠,您可以编写查询:
SELECT oldest.f_id AS id, f_title AS name,f_dept AS dept,f_last_view AS last_view
FROM forum AS oldest
LEFT JOIN (
SELECT f_id FROM forum ORDER BY last_view DESC LIMIT 10
) AS newest ON newest.f_id = oldest.f_id
WHERE newest.f_id IS NULL
ORDER BY last_view ASC
LIMIT 10
这将确保过滤掉前十名中的所有条目,仅留下(在此示例中)最旧列表中最旧的5条。
**已更新以使用LEFT JOIN来抓取并过滤掉前10名,因为在LIMIT
和类似比较函数中使用的子查询显然不允许使用IN
。