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, 資料筆數

重要的筆記…

Posted in DB
2 comments on “MySQL 排序兩個欄位的方法 (使用IF)
  1. kong0107 says:

    關於討論區排序的指令,在下有不同作法:
    當有新文章時,就將REPLY_TIME也設為NOW()
    這樣一來就只需要ORDER BY REPLAY_TIME DESC

    而如果需要找出「未被回覆」的文章,可以用WHERE REPLY_TIME = `TIME`
    或是另外有一個欄位來儲存回覆數量

    不過,這樣REPLY_TIME可能就不符合字面上的意思了,或許可以更名為LAST_EDIT

  2. ocean says:

    謝謝,記下….

Leave a Reply

Your email address will not be published.