PHP - 如果行大于20

时间:2015-06-01 08:08:56

标签: php mysql

我在数据库的最新10个之后显示了前10个最新和最后10个最早的主题。我能够在前10个主题中显示我需要的内容。我的问题是,当我在数据库中有21个主题时,最后10个主题根据我的需要显示,但是当我只有20个主题时,最后一个主题在最新的将仍然是最古老的。为了使它更清楚,这是一个参考图片。

- 当我在数据库中有21个或更多主题时会发生这种情况 -

This is what happen when I have 21 or more topics in database - 当我在数据库中有20个主题时会发生这种情况 - This is what happen when I have 20 topics in database

我不希望像我有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_ *已被弃用但请耐心等待。提前谢谢

2 个答案:

答案 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个条目,你会想要:

最新

  • 15
  • 14
  • 13
  • 12
  • 11
  • 10
  • 9
  • 8
  • 7
  • 6

最早的名单为:

最旧

  • 5
  • 4
  • 3
  • 2
  • 1

为避免重叠,您可以编写查询:

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