在mysql下,谁能帮我把这个sql语句优化一下,谢谢了SELECT *
FROM (SELECT `country_name` , count( * ) AS num
FROM `lomo_track_201106`
GROUP BY `country_name`
ORDER BY num DESC
) AS a
LIMIT 0 , 20
UNION ALL SELECT 'other', sum( num ) AS num
FROM (SELECT `country_name` , count( * ) AS num
FROM `lomo_track_201106`
GROUP BY `country_name`
ORDER BY num DESC
LIMIT 20 , 1000000
) AS b;

解决方案 »

  1.   

    表中有无唯一标识的字段,

    SELECT `country_name` , count( * ) AS num
    FROM `lomo_track_201106`
    GROUP BY `country_name`
    ORDER BY num DESC
    存为 VIEW
      

  2.   


    不想用视图 也不想用存储过程
    要求就是  查询出来数量在前二十的国家名称   然后将其他的国家的数量归到other字段里面
      

  3.   

    首先country_name加索引不需要多讲了。如果不用view的话,
    可以考虑使用减法来统计other的count,理论上在country数量较多的时候,会有点优势 SELECT country_name, num FROM
    (SELECT country_name, count(*) AS num FROM lomo_track_201106 GROUP BY country_name ORDER BY num DESC LIMIT 20) a
      UNION ALL
     SELECT 'other', b.total - sum(a.num) FROM
    (SELECT country_name, count(*) AS num FROM lomo_track_201106 GROUP BY country_name ORDER BY num DESC LIMIT 20) a,
    (SELECT count(*) AS total FROM lomo_track_201106) b因为无条件统计一张表的记录数,这个不需要扫描表或索引的。
      

  4.   

    这么大叔.... 你这个的b.total 的总计不等于
    (SELECT country_name, count(*) AS num FROM lomo_track_201106 GROUP BY country_name ORDER BY num DESC LIMIT 20)

    (SELECT country_name, count(*) AS num FROM lomo_track_201106 GROUP BY country_name ORDER BY num DESC LIMIT 20,1000000)的吧?
      

  5.   

    看清楚了再说:
    SELECT 'other', b.total - sum(a.num) FROM