mytable表中 有 id name  price upRange 等字段 
要求 筛选出id出现频率最高的前20 个 并且upRange字段的值要>=7.00 查询结果应该是这样的
id   name  price  count  upRange
 3   ssss   7.66    30     8.99
 4   xxx    6.79    25     9.88
 15  yyyy   3.22    23     9.21
 34  uuuu   7.65    21     8.95
price 和 upRange 都是经过加权平均的。

解决方案 »

  1.   

    记录?
    select id,count(*) from tt group by id where upRange>=7.00
      

  2.   

    select * from (
    select id,count(*) as ma from tt group by id where upRange>=7.00) a order by ma limit 20
      

  3.   

    price 和 upRange 都是经过加权平均的。:举例说明
      

  4.   

    虽然 id相同,但price 和upRange 有可能不相同。
    所以要求其平均值哦 
      

  5.   

    select * from ( 
    select id,count(*) as ma,avg(price),avg(upRange) from tt group by id where upRange>=7.00) a order by ma limit 20贴记录
      

  6.   

    select 
      id,
      name,
      avg(price) as price,
      count(1) as cnt,
      avg(upRange) as upRange
    from
      mytable 
    where 
      upRange>=7.00 
    group by 
      id,
      name 
    order by 
      cnt desc 
    limit 
      20
    这样?
      

  7.   


    select id,name,avg(price),count(*),avg(upRange)
    from mytable
    where upRange>=7.00 
    group by id,name
    order by 2 desc
    limit 20有两处你的扫描可能会有疑义:
    1。 price 和 upRange 都是经过加权平均的。这个加权平均是如何计算?上面代码用了一个简单平均。
    2。筛选出id出现频率最高的前20 个 并且upRange字段的值要>=7.00 (是先找频率最高的,然后挑出平均upRange>7的,还是先计算所有>7的记录的平均再选?)上面代码是先挑出所有>7的记录再做频率的统计。
      

  8.   


    解释下 count字段:即id号出现的频率。应该是由高到低排列的。
      

  9.   

    select id,name,avg(price),count(*),avg(upRange)
    from mytable
    where upRange>=7.00 
    group by id,name
    order by count(*) desc
    limit 20
    代码写错了,测试的时候调整了一下字段的顺序,改成  order by count(*) desc, 或者 oder by 4 desc. 后一种语法是以第4列来排序(第4列也是就 count(*))
      

  10.   

    另外 简单平均即可。没想到 随口一说给大家带来了不小的困惑 sorry