MySQL分頁查詢:如何避免父類cid重復且保證排序?

MySQL分頁查詢:如何避免父類cid重復且保證排序?

mysql分頁查詢及父類cid去重排序優化

在MySQL數據庫分頁查詢中,如何避免結果集出現父類(cid)重復項,同時保持排序,是一個常見挑戰。本文將通過一個案例,詳細講解解決方案。

假設表test2包含id、cid、name和reding四個字段。目標:按reding字段降序排列,每頁顯示3條數據,且每頁cid不重復。

簡單的GROUP BY語句無法滿足分頁需求,因為它會聚合相同cid的所有行。我們需要更有效的策略。

一種解決方案是結合子查詢和字符串函數。我們可以利用SUBSTRING_INDEX函數從name字段提取父類信息和頁碼信息。例如,對于name值為p1_2,SUBSTRING_INDEX(name, ‘_’, 1)返回p1(父類),SUBSTRING_INDEX(name, ‘_’, -1)返回2(頁碼)。

構建子查詢,對test2表排序,提取所需字段及父類、頁碼信息。外層查詢根據指定頁碼過濾數據,并限制返回結果數量。

以下sql語句演示查詢第二頁數據 (page=2):

SELECT id, cid, name, reding FROM (     SELECT id, cid, name,             SUBSTRING_INDEX(name, '_', 1) AS parent,            SUBSTRING_INDEX(name, '_', -1) AS page,            reding     FROM test2     ORDER BY reding DESC ) AS tmp WHERE tmp.page = 2 LIMIT 3;

內層查詢按reding降序排序,并提取相關信息。外層查詢根據page篩選第二頁數據,并限制返回3條記錄,確保每頁cid不重復。

示例結果 (假設數據):

id cid name reding
2 1 p1_2 99
5 2 p2_2 96
8 3 p3_2 93

此方法依賴于name字段的特定格式。如果格式改變,需要相應調整SUBSTRING_INDEX函數的使用方式。 更通用的方法可能需要對數據庫結構進行調整,例如添加一個單獨的字段存儲父類信息,從而避免依賴于name字段的格式。

? 版權聲明
THE END
喜歡就支持一下吧
點贊12 分享