1
chairo 2012-12-27 16:49:00 +08:00
说下我的思路:
1. 取Max(stage_id) 2. 根据上步的stage_id取数据到临时表,同时转换star为一个可排序的数字,S》A》... 3. 如临时表数据超过100,按转换后的star和created排序取前100 4. 不够100,取<Max(stage_id)的第一个stage_id,重复2、3 感觉耗时不会超过你前边的100秒…… |
2
chairo 2012-12-27 16:52:38 +08:00 1
补上楼:
重复用户数据的问题在临时表中去重……操作一个小表怎么也比你直接在大表中就去重要效率高很多 |
3
piresion OP @chairo 在第一步使用group by uid再取最大的stage_id么?
SELECT uid FROM `table` WHERE stage_id in (SELECT max(stage_id) FROM `table` GROUP BY uid) ORDER BY stage_id desc,star ASC,created ASC limit 0,100 这样么? 这样感觉也有问题呢 |
4
chairo 2012-12-27 17:05:45 +08:00
@piresion 看我后边补充的,第一次时候不需要任何group by,只是取最大stage_id,在操作大表时候尽量简化查询条件。取出一部分数据再操作临时表时候可以group by uid等复杂一些的操作。把复杂的sql拆分成简单的多条sql可能最后效率会比一条复杂大sql反而会高……
|
5
123123 2012-12-27 17:45:48 +08:00
如果最大关卡数是4,那么完成 4 A 的用户优先级会大于 3 S 的用户?如果是这样,那么
我的思路是先取出最大关卡数评价为S的所有数据,再在这张临时表中进行时间排序,如果不够那么再去取最大关卡数评价为A的所有数据,依次类推直到凑够100个未知。 这样应该也不会超过你的100秒 |
6
123123 2012-12-27 17:51:06 +08:00
|
7
piresion OP |
8
plprapper 2012-12-28 17:21:23 +08:00
在数据库中多存放一个字段 数字类型的 把关卡数 时间 得分评价 转成数字(拼接起来) 对该字段进行排序 (加索引 )这条sql就很简单了 比较这个字段的大小就是你需要的了。 然后 limit100
|