作者mrbigmouth (拒絕崩潰的蒲公英)
看板Database
標題[MySQL]求留言板查詢語法優化
時間Mon May 30 19:55:19 2011
現有一個留言板資料表board結構如下
id(int) rid(int) time(timestamp) title(char) text(text)
其中id是auto_increment主鍵,代表每篇留言的唯一編號
rid可為NULL,若為NULL,則代表此篇留言為有標題的留言
若有,則代表此篇留言為某特定標題底下的留言,標題為id為rid的title
範例如下
id rid time title text
1 NULL T 標題一 這是標題一的發起留言
2 1 T+1 NULL 這是標題一之下的比較舊回覆留言
3 NULL T+2 標題二 這是標題二的發起留言
4 1 T+3 NULL 這是標題一之下的最新留言
5 NULL T+4 標題三 這是標題三的發起留言
6 NULL T+5 標題四 這是第四個標題
留言板在顯示時會分頁
每頁會顯示三個標題與標題底下的所有留言,且越新的留言會在越前面
每個標題的新舊程度以回覆其標題下的最新留言為準
但標題留言應在同一標題的最上方
也就是說,希望透過SQL語法抓出以下表格
第一頁要顯示的留言
id rid time title text
6 NULL T+5 標題四 這是第四個標題
5 NULL T+4 標題三 這是標題三的發起留言
1 NULL T 標題一 這是標題一的發起留言
4 1 T+3 NULL 這是標題一之下的最新留言
2 1 T+1 NULL 這是標題一之下的比較舊回覆留言
目前我是使用以下語法
SELECT * FROM (
SELECT DISTINCT `tID` FROM (
SELECT IFNULL(`rid`,`id`) AS `tID`,`time` FROM `board` ORDER BY `time` DESC
) AS `T1` LIMIT 3
) AS `T2`,`board` WHERE `T2`.`tID`=`board`.`id` OR `T2`.`tID`=board`.`rid`
ORDER BY `board`.`time` DESC
之後再用php語法檢查其其id一一填入陣列再顯示
其中光是SELECT就有三次....orz
希望請教高手有沒有比較不吃資源、最好能不依靠PHP做額外處理的方法....
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 218.170.58.115
推 danielguo:把"標題"拉出來建一個表應該會比較容易, 管理也簡單 05/31 02:12
→ mrbigmouth:是比較簡單沒錯 但希望能不改動現有結構.... 05/31 05:56