繁体   English   中英

mysql select 一个条目,然后是接下来的 n 个条目

[英]mysql select an entry and then the next n entries

我有一个网页,用户可以从该网页 select 来自 MySQL DB 的条目。 显示此条目后,我希望有一个按钮允许用户 select 下五个 DB 条目另一个按钮允许用户 select 前 5 个条目。

如何编写这两个按钮的查询?

我有一个主键列_id和一个日期列date ,但是两者都存在差距,从表中选择所有数据会导致:

+-----+------------+
| _id | date       |
+-----+------------+ 
|   4 | 2020-11-26 | 
|   5 | 2020-11-28 |
|   6 | 2020-11-29 | 
|   7 | 2020-12-01 | 
|   8 | 2020-12-08 | 
|  10 | 2020-12-22 | 
|  12 | 2020-12-25 |
+-----+------------+

对于第一个按钮(接下来的五个条目),我尝试过:

select * from Blog where post=1 and _id=5 order by date desc limit 5 offset 5;

它返回 0 条记录,并且

select * from Blog where post=1 and _id>=5 order by date desc limit 5 offset 5;

它也返回 0 条记录。

我不知道如何编写第二个按钮的查询,前五个条目。

任何帮助,将不胜感激。

关于使用limitoffset的更详细解释(因为我的评论“不起作用”):

假设您有一个带有“很多结果”的查询,例如: SELECT i FROM integers; ,并且您确实希望将其分页为 5 条记录的页面。

执行时: SELECT i FROM integers LIMIT 5 OFFSET 0; 将给出前 5 行。 第一个是因为读取从OFFSET 0开始。

mysql> SELECT i FROM integers ORDER BY i LIMIT 5 OFFSET 0;
+---+
| i |
+---+
| 0 |
| 1 |
| 2 |
| 3 |
| 4 |
+---+
5 rows in set (0.00 sec)

接下来 5 条记录可以通过执行SELECT i FROM integers LIMIT 5 OFFSET 5;

或者,换句话说,OFFSET 之后的值应该是(pagenummer-1)*5 pagenumber=1 是第一页。

获取第 42 页的示例( (42-1)*5=205 ):

mysql> SELECT i FROM integers ORDER BY i LIMIT 5 OFFSET 205;
+-----+
| i   |
+-----+
| 205 |
| 206 |
| 207 |
| 208 |
| 209 |
+-----+
5 rows in set (0.00 sec)

但是,EXPLAIN 显示出一些有趣的东西:

mysql> explain SELECT i FROM integers ORDER BY i LIMIT 5 OFFSET 205\G
*************************** 1. row ***************************
           id: 1
  select_type: SIMPLE
        table: integers
   partitions: NULL
         type: index
possible_keys: NULL
          key: PRIMARY
      key_len: 4
          ref: NULL
         rows: 210
     filtered: 100.00
        Extra: Using index
1 row in set, 1 warning (0.00 sec)

插入的东西是需要读取 210 行才能产生这 5 行结果。

我的问题有两个部分:

  1. 我如何获得接下来的 5 个条目?
  2. 我如何获得前 5 个条目?

虽然我得到了 (1) 的答案,但我不得不从各种答案中分出一部分来获得我想要的结果。 我想出的是:

$query_blog = 'select * from Blog where _id<'.$_POST['_id_last'].' order by date desc limit 5';

其中,根据上述答案之一,我发布了最后显示的条目 $_POST['_id_last'],并将其用作查询的起点。

对于(2),没有人提到,我想出的是

$query_blog = 'select * from (select * from Blog where _id>'.$_POST['_id_last'].' limit 5) as subquery order by date desc';

我使用子查询获取前 5 个条目并将其包装在一个查询中,该查询按降序对结果进行重新排序。

(2) 可能有一个更优雅的解决方案,但这是我想出的,它对我有用。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM