MySQL 排序兩個欄位的方法 (使用IF)
Nov
10
MySQL 排序兩個欄位的方法 (使用IF)
討論區很常見的排法是這樣:「按照所有文章的發表時間排序,但是如果有最新回應的話,則是會把最新回應的時間一起排進去。」
照古早的寫法:
SELECT * FROM `forum` ORDER BY `REPLY_TIME` DESC, `TIME` DESC;
這樣會爆掉,因為它會把 REPLY_TIME 都排完,才排 TIME ,而這並不是我們想要的。
MySQL 有提供 IF 的功能,
用法: IF (bool,value1,value2)
解釋:當第一個參數為真時,回傳 value1,否則傳回 value2
可以改寫成:
SELECT
IF(`REPLY_TIME` > `TIME`, `REPLY_TIME`, `TIME`) AS `TEMPTIME`, `ID`, `POST_TITLE`, `POST_CONTET`
– 這邊是其他欄位,而 TEMPTIME 則是產生的新欄位。
FROM `forum`
WHERE 條件子句
ORDER BY `TEMPTIME` DESC;
LIMIT 0, 資料筆數
我就碰到过这类事情,在迁移一论坛的时候没注意regdate的问题,由于是试用的采用的TIMESTAMP时间戳,范围是’1970-01-01 00:00:00′到2037年。在数据库中保存的最高值是: mysql> select unix_timestamp(’2037-12-31 23:59:59′); 这样在数据库中保存的一般是10位的一个数,而以前的数据库中保留的字段是13位,在时间戳的后面加上了3个0来代表毫秒数 –_-!! 我们论坛建立比较早,大概在1999年吧,这个时候的时间戳只有9位数,加上补充的3个0总共才12位,在进行论坛转换的时候没有注意到,导致转换成新论坛的时候才发现用户注册的时间不对了。解决办法是重新将时间进行导入更新。将老论坛的时间后3位多余的0去掉,这个时候由于保存的时间有12位和13位数的区别,不能采用一刀切的方式,即取前10位数的办法,需要做一个判断,如果长度等于12,则取前9位,长度等于13,则取10位,可以采用mysql的if语句来实现了: insert into temp_uc_members(uid,regdate) select ID,if(char_length(RegTime)=12,substring(RegTime,1,9),substring(RegTime,1,10)) from BBSCS_USERINFO;
+—————————————————+
| unix_timestamp(’2037-12-31 23:59:59′) |
+—————————————————+
| 2145887999 |
+—————————————————+
1 row in set (0.00 sec)


















No Comments »
No comments yet.
RSS feed for comments on this post. TrackBack URI
Leave a comment
If you want to leave a feedback to this post or to some other user´s comment, simply fill out the form below.