首页 > 开发 > MySQL > 正文

SQL分组排序、随机问题?

2017-09-08 09:01:32  来源:网友分享

有一个帖子的回复表,
posts(id , tid , subject ,message ,dateline),
其中:id为自动增长字段,tid为该回复的主体帖子的id(外键关联),subject为回复标题,message为回复内容,dateline为回复时间,用UNIX时间戳表示。
请写SQL,

  1. 选出按时间排序的前十个来自不同主题的最新回复;

  2. 随机选一条回复记录;

解决方案

目测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;