作者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
1F:推 danielguo:把"标题"拉出来建一个表应该会比较容易, 管理也简单 05/31 02:12
2F:→ mrbigmouth:是比较简单没错 但希望能不改动现有结构.... 05/31 05:56