[英]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.