我正在改进我继承的一些查询,并想知道是否可以执行以下操作-给定一个如下所示的表:
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
最终结果将反映每个unique
uri
的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万行)的数据集,子查询变得非常昂贵。直觉告诉我这是不可行的,但我想我会这么问。。。
最佳答案
不需要子查询——您可以使用count
和distinct
来获得相同的结果:
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/