select tb.city,tb.flag,tbt.numfrom tb left join (select city,sum(num1+num2) num from tb group by city)tbt on tb.city=tbt.cityorder by tbt.num desc不知道行不行,和你原来的差不多。只是不知道你为什么要两次做+?不是很浪费吗。使用一次group by 之后基本上就OK了,就是缺了个flag而已。加上就可以了。800万的数据两次全表扫描时间的确有点长,尽量减少不必要的东西吧。使用C语言是不理智的,毕竟C针对的是记录,一条条的交个自己的小电脑处理猴年马月也得不到结果啊。还是使用服务器吧。(如果你用自己的电脑做服务器。。。。)