我正在改进我继承的一些查询,并想知道是否可以执行以下操作-给定一个如下所示的表:

  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

作为一个隐含的中间步骤,我想用the_table的1+2元组对它们进行分组。该步骤的结果如下:
  id   base
  ---+---------------
   1   /foo/bar
   1   /foo/boo
   2   /alpha/beta
   2   /alpha/delic
   3   /plastik/man

最终结果将反映每个uniqueuri的unique 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;

我想避免使用子查询的原因是,我正在处理一个相当大(2000万行)的数据集,子查询变得非常昂贵。直觉告诉我这是不可行的,但我想我会这么问。。。

最佳答案

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

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

SQL Fiddle Demo
顺便说一句——这个返回id 3的计数为1——我认为这是你的帖子中的一个错误。

关于mysql - MySQL多步骤GROUP BY,不带子查询,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/27434069/

10-12 00:02
查看更多