MySQL查询 - 分组问题

时间:2013-06-25 14:26:51

标签: mysql group-by

所以这是我的查询

select 
A.search_parameters,
reseller_count,
reseller,
num

from 

(select 
 search_parameters,
 count(distinct(reseller)) as reseller_count 
 from all_lookups 
 group by search_parameters)A

 join

 (select
  search_parameters,
  reseller,
  count(*) as num
  from all_lookups
  group by reseller,search_parameters)B

  on A.search_parameters=B.search_parameters

  where a.search_parameters not like '%addsomekeywords%' 
  and a.search_parameters not like '%add-some%' 
  order by reseller_count DESC,num 
  DESC limit 1000

出于某种原因,结果按reseller_count分组,但我希望它们按search_parameters分组。我尝试在where子句之后添加A.search_paramters的一个组,但这会产生错误 '选择列表表达式不是由聚合输出产生的(GROUP BY子句中缺少?)' 注意我在Cloudera Impala中使用此查询可能也很重要,但我怀疑相同的MySQL规则/语法仍然适用

这是我得到的一个例子

A.search_parameter|reseller_count|reseller|num
hello             | 2            | abc    |556
hi                | 2            | tre    |54
hello             | 2            | xyz    |9
hi                | 2            | ytu    |4

我想要的是

A.search_parameter|reseller_count|reseller|num
hello             | 2            | abc    | 556
hello             | 2            | xyz    | 9
hi                | 2            | tre    | 54
hi                | 2            | ytu    | 4

基本上,所有具有相同reseller_count的search_parameters都会随机放在一起,但我希望它们按search_parameter分组

由于

2 个答案:

答案 0 :(得分:1)

除了使您现有的查询更具可读性之外,您唯一需要更改的是最外层的order by子句,只是在search_parameters上,然后是num descending。聚合已经从您的JOINED查询结果中“分组”。

select 
      A.search_parameters,
      A.reseller_count,
      B.reseller,
      B.num
   from 
      ( select 
              search_parameters,
              count(distinct(reseller)) as reseller_count 
           from 
              all_lookups 
           group by 
              search_parameters ) A
      join
      ( select
              search_parameters,
              reseller,
              count(*) as num
           from 
              all_lookups
           where 
                  search_parameters not like '%addsomekeywords%' 
              and search_parameters not like '%add-some%' 
           group by 
              search_parameters,
              reseller ) B

         on A.search_parameters = B.search_parameters
   order by 
      A.search_parameters,
      B.num DESC 
   limit 
      1000

根据反馈/评论。 如果您也想根据转销商数量计算,请按照我的说明调整您的订单。

   order by 
      A.reseller_count DESC,
      A.search_parameters,
      B.num DESC 

那么,这样做的目的是让所有拥有最高代理商的人都在列表的顶部...然后,如果您有多个具有相同高代理商数量的“search_parameters”,它们将被组合在一起,最后,在每个搜索参数中,具有最高编号的经销商将列在顶部。采取以下样本数据计算..

我在这里更改了列名称标题,专门用于澄清样本。

DistResell   SearchParm   ActualReseller   NumPerReseller
   4         X            Mary             405
   4         X            Bob              108
   4         X            George           107
   4         X            Jane              98
   4         Y            Jim              290
   4         Y            Jill             287
   4         Y            Mary             243
   4         Y            Sam              164
   3         A            Sam              201
   3         A            Mary             187
   3         A            Joe              146
   2         D            Jim              73
   2         D            Kathy            67
   2         G            Mary             140
   2         G            Jeff             125

因此,正如您在本示例中所看到的,有两个搜索参数找到“X”和“Y”,每个搜索参数都有4个代理商,所以即使字母大于搜索参数“A”,它们也会被推到列表顶部(数为3)。现在,在4个经销商组中,它们是alpha,因此“X”在“Y”之前。擅长这个级别。现在,无论经销商是谁,您都希望按照每个不同经销商的“num”数进行排序。

“A”接下来是3个经销商,没有混淆。

然后下至2个搜索参数为“D”和“G”的经销商......遵循类似的层次结构,我们已经知道的4是最后一组,然后是“D”和“G”的alpha,最后在每个“D”和“G”中,最高的“num”。

这会更好地说明您要完成的工作吗?

答案 1 :(得分:0)

你可以这样做将整个查询包装为tabel

SELECT q.* FROM (
SELECT 
A.search_parameters,
reseller_count,
reseller,
num

FROM 

(SELECT 
 search_parameters,
 COUNT(DISTINCT(reseller)) AS reseller_count 
 FROM all_lookups 
 GROUP BY search_parameters)A

 JOIN

 (SELECT
  search_parameters,
  reseller,
  COUNT(*) AS num
  FROM all_lookups
  GROUP BY reseller,search_parameters)B

  ON A.search_parameters=B.search_parameters

  WHERE A.search_parameters NOT LIKE '%addsomekeywords%' 
  AND A.search_parameters NOT LIKE '%add-some%' 
  ORDER BY reseller_count DESC,num 
  DESC LIMIT 1000
  ) q GROUP BY q.search_parameters

以下是示例

SELECT q.* FROM (your whole query) q GROUP BY q.any_column_in_query