[英]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 条记录。
我不知道如何编写第二个按钮的查询,即前五个条目。
任何帮助,将不胜感激。
关于使用limit
和offset
的更详细解释(因为我的评论“不起作用”):
假设您有一个带有“很多结果”的查询,例如: 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) 的答案,但我不得不从各种答案中分出一部分来获得我想要的结果。 我想出的是:
$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.