簡體   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