現有一張使用者資料表 user_table
裡面有個 birthday
欄位存放使用者出生日期(如 1994-01-01、1996-07-1
)對應的時間戳資料
現在需要按照生日從近到遠的排序來分頁查找用戶資料
例如今天2016-07-28
的話,生日日期分別為1995-07-30
、1993-11-31 1997-08-29
、1995-07-27
的四個使用者資料排序後就是
1995-07-30
、1997-08-295-07-30
、1997-08-29
-07-27
SQL 語句怎麼寫才能滿足這樣的查詢條件?
現有一張使用者資料表回覆內容:
birthday 欄位存放使用者出生日期(如
1994-01-01、1996-07-1)對應的時間戳資料
現在需要按照生日從近到遠的排序來分頁查找用戶資料
例如今天
的話,生日日期分別為1995-07-30
、
1993-11-31 1997-08-29、
1995-07-27
的四個使用者資料排序後就是1995-07-30
、
1997-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>
查詢的時候查詢兩次, 首先是查詢 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>
mysql 把時間1995-07-30 ,先轉換成一年中的第幾天DAYOFYEAR('1995-07-30'),減去今天是一年中的第幾天,得到一個差值然後order by 一下就行。
<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-291993-11-31
1999-01-01
1995-07-27