2009
06.04

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

照古早的寫法:

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

重要的筆記…

1 comment so far

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

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

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

:alien: :angel: :angry: :blink: :blush: :cheerful: :cool: :cwy: :devil: :dizzy: :ermm: :face: :getlost: :biggrin: :happy: :heart: :kissing: :lol: :ninja: :pinch: :pouty: :sad: :shocked: :sick: :sideways: :silly: :sleeping: :smile: :tongue: :unsure: :w00t: :wassat: :whistle: :wink: :wub:

XHTML: You can use these tags: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>