首頁 >後端開發 >php教程 >SQL 分頁查詢資料依照生日日期從近到遠排序該如何處理?

SQL 分頁查詢資料依照生日日期從近到遠排序該如何處理?

WBOY
WBOY原創
2016-08-04 09:19:412223瀏覽

現有一張使用者資料表 user_table 裡面有個 birthday 欄位存放使用者出生日期(如 1994-01-01、1996-07-1)對應的時間戳資料

現在需要按照生日從近到遠的排序來分頁查找用戶資料
例如今天2016-07-28 的話,生日日期分別為
1995-07-301993-11-31 1997-08-291995-07-27 的四個使用者資料排序後就是
1995-07-30
1997-08-295-07-301997-08-29 -07-27 SQL 語句怎麼寫才能滿足這樣的查詢條件?

或者說我這存放生日的資料表結構要修改成怎樣才合適?


回覆內容:
現有一張使用者資料表

user_table

裡面有個

birthday 欄位存放使用者出生日期(如 1994-01-01、1996-07-1)對應的時間戳資料 現在需要按照生日從近到遠的排序來分頁查找用戶資料例如今天

2016-07-28

的話,生日日期分別為
1995-07-30
1993-11-31 1997-08-291995-07-27 的四個使用者資料排序後就是1995-07-301997-08-295-07-30

1997-08-29 -07-27 SQL 語句怎麼寫才能滿足這樣的查詢條件? 或者說我這存放生日的資料表結構要修改成怎樣才合適?

不考慮資料量和效能問題的簡單做法:


加一個欄位, 保存dayofyear的資訊, 例如說這個欄位名稱就叫day_of_year, 那麼你插入語句是這樣的:

<code class="mysql">insert into user_table set ... = ..., day_of_year = DAYOFYEAR('1995-07-30');</code>
  1. 查詢的時候查詢兩次, 首先是查詢 day_of_year 字段大於你的當前值的, 然後查詢這個字段小於當前值的, 按 day_of_year 排序:

<code class="mysql">select * from user_table where day_of_year >= DAYOFYEAR(CURDATE()) order by day_of_year asc;
select * from user_table where day_of_year < DAYOFYEAR(CURDATE()) order by day_of_year asc;</code>
  1. 先前少看一個條件

    mysql 把時間1995-07-30 ,先轉換成一年中的第幾天DAYOFYEAR('1995-07-30'),減去今天是一年中的第幾天,得到一個差值然後order by 一下就行。

  2. 如果生日的月日一樣,可以再按年遞增排序。
<code>select * from user_table order by (DAYOFYEAR(birthday)-DAYOFYEAR(curdate())),year(birthday) ASC</code>

思路:你這個其實就是先按相減之後的月排,排完之後再按相減之後的日排

<code>mysql> SELECT name, birthday FROM user_table
 -> WHERE MONTH(birthday) = MONTH(DATE_ADD(CURDATE(),INTERVAL 1 MONTH))
 -> ORDER BY DAY(birthday) asc;
 </code>

上面這個代碼可以實現獲取當前月份之後1個月的生日數據並按照日昇序排列,你再寫個repeat把後面的取出來就好了

<code>DROP TEMPORARY TABLE IF EXISTS aa;
DROP TEMPORARY TABLE IF EXISTS bb;
create temporary table aa(select birthday from user_table 
WHERE substring(birthday,6,10)>'07-28' ORDER BY substring(birthday,6,10) asc);
create temporary table bb(select birthday from user_table 
WHERE substring(birthday,6,10)<'07-28' ORDER BY substring(birthday,6,10) asc );
SELECT * FROM aa Union All SELECT * FROM bb
测试了一下,效果如图所示</code>

1995-07-30

1997-08-29

1993-11-31

1999-01-01

1995-07-27

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn