84669 人学习
152542 人学习
20005 人学习
5487 人学习
7821 人学习
359900 人学习
3350 人学习
180660 人学习
48569 人学习
18603 人学习
40936 人学习
1549 人学习
1183 人学习
32909 人学习
有一个帖子的回复表,posts(id , tid , subject ,message ,dateline),其中:id为自动增长字段,tid为该回复的主体帖子的id(外键关联),subject为回复标题,message为回复内容,dateline为回复时间,用UNIX时间戳表示。请写SQL,
选出按时间排序的前十个来自不同主题的最新回复;
随机选一条回复记录;
ringa_lee
目测1楼第一句不对,没有保证不同的主题,我是这么写的:
select * from posts p where p.dateline = (select max(dateline) from posts where tid = p.tid) order by dateline desc limit 10;
其实dateline和id应该顺序是一致的,可以考虑换成id,id上主键应该效率更高:
select * from posts p where p.id = (select max(id) from posts where tid = p.tid) order by id desc limit 10;
第2句个人觉得最好还是不用ORDER BY RAND(),数据量稍微多一点就会效率低下,因为这样写可以会导致多次扫描,这样写可能会好一点:
SELECT * FROM posts WHERE id >= ((SELECT MAX(id) FROM posts)-(SELECT MIN(id) FROM posts)) * RAND() + (SELECT MIN(id) FROM posts) LIMIT 1;
试试看,如果表数据过大不建议使用ORDER BY RAND(),你先试试这两句SQL行不行。希望对你有帮助.
ORDER BY RAND()
SQL
SELET `id`,`tid`,`subject`,`message`,`dateline` FROM `posts` WHERE `tid`=NULL ORDER BY `tid`,`dateline` SELET `id`,`tid`,`subject`,`message`,`dateline` FROM `posts` WHERE `tid`=!NULL ORDER BY RAND() LIMIT 1
楼上第一条回答目测不对吧,以下个人见解,欢迎点评指教
select t2.* from (select tid,max(dateline) maxDateline from posts group by tid order by maxDateline desc limit 10)t1 inner join posts t2 on t1.tid=t2.tid and t1.maxDateline=t2.dateline
目测1楼第一句不对,没有保证不同的主题,我是这么写的:
其实dateline和id应该顺序是一致的,可以考虑换成id,id上主键应该效率更高:
第2句个人觉得最好还是不用ORDER BY RAND(),数据量稍微多一点就会效率低下,因为这样写可以会导致多次扫描,这样写可能会好一点:
试试看,如果表数据过大不建议使用
ORDER BY RAND()
,你先试试这两句SQL
行不行。希望对你有帮助.楼上第一条回答目测不对吧,以下个人见解,欢迎点评指教