MySQL多步GROUP BY没有子查询

时间:2014-12-11 23:03:18

标签: mysql select group-by

我正在努力改进我继承的一些查询,并且如果有可能执行以下操作则很奇怪 - 给出一个如下所示的表the_table

  id   uri
  ---+-------------------------
   1   /foo/bar/x
   1   /foo/bar/y
   1   /foo/boo
   2   /alpha/beta/carotine
   2   /alpha/delic/ipa
   3   /plastik/man/spastik
   3   /plastik/man/krakpot
   3   /plastik/man/helikopter

作为一个隐含的中间步骤,我希望将它们分组为uri的第1 + 2个元组。该步骤的结果如下:

  id   base           
  ---+---------------
   1   /foo/bar      
   1   /foo/boo      
   2   /alpha/beta   
   2   /alpha/delic  
   3   /plastik/man

最终结果将反映每个唯一id的唯一tuple1 + tuple2值的数量:

  id   cnt
  ---+-----
   1   2
   2   2
   3   1

我可以实现这些结果,但不能没有做一个子查询(以获得上面提到的隐式步骤的结果),然后选择/分组。类似的东西:

SELECT
  id,
  count(base) cnt
FROM (
  SELECT
    id,
    substring_index(uri, '/', 3) AS base
  FROM the_table
  GROUP BY id, base
)
GROUP BY id;

我想避免子查询的原因是我使用了相当大的(20M行)数据集,并且子查询变得非常昂贵。 Gut告诉我这不可行,但我想问我......

1 个答案:

答案 0 :(得分:2)

不需要子查询 - 您可以count使用distinct来获得相同的结果:

SELECT
    id,
    count(distinct substring_index(uri, '/', 3)) AS base
FROM the_table
GROUP BY id

顺便说一句 - 对于身份3,这会返回1的计数 - 我认为这是您帖子中的拼写错误。