MySQL 排序兩個欄位的方法 (使用IF)

MySQL 排序兩個欄位的方法 (使用IF)

Filed under: 东写西读 |  

討論區很常見的排法是這樣:「按照所有文章的發表時間排序,但是如果有最新回應的話,則是會把最新回應的時間一起排進去。」
照古早的寫法:


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′);
+—————————————————+
| unix_timestamp(’2037-12-31 23:59:59′) |
+—————————————————+
|                            2145887999                 |
+—————————————————+
1 row in set (0.00 sec)

这样在数据库中保存的一般是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;


Del.icio.us Google书签 Digg Live Bookmark Technorati Furl Yahoo书签 Facebook 百度搜藏 新浪ViVi 365Key网摘 天极网摘 和讯网摘 博拉网 POCO网摘 添加到饭否 QQ书签 Digbuzz我挖网

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.

(required)

(required)