You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用RedisSearch实现嵌套分组的SQL查询?

实现RedisSearch双层分组(对应SQL嵌套GROUP BY)

方法1:单次FT.AGGREGATE完成双层分组

不需要存储中间结果,直接在一个命令里完成两次分组逻辑,完全匹配你的SQL嵌套查询:

redis-cli FT.AGGREGATE postsIndex \
  "@PostTypeId:[1 1]" \
  # 第一层分组:按OwnerUserId统计每个用户的提问数
  GROUPBY 1 @OwnerUserId \
  REDUCE COUNT 0 AS NumPreguntas \
  # 第二层分组:按提问数统计对应用户数量
  GROUPBY 1 @NumPreguntas \
  REDUCE COUNT 0 AS NumUsers \
  # 按提问数升序排序
  SORTBY 2 @NumPreguntas ASC \
  # 限制返回34条结果
  LIMIT 0 34
  • 第一层GROUPBY @OwnerUserId+REDUCE COUNT 0对应SQL内层的SELECT OwnerUserId, COUNT(*) AS NumQuestions FROM Posts WHERE PostTypeId=1 GROUP BY OwnerUserId
  • 第二层GROUPBY @NumPreguntas+REDUCE COUNT 0对应SQL外层的GROUP BY NumQuestions COUNT(OwnerUserId) AS NumUsers
  • SORTBY和LIMIT对应SQL的ORDER BY NumQuestions LIMIT 34

方法2:存储中间结果到新索引(用于后续重复查询)

如果需要保留内层查询的结果供后续多次使用,可以将结果写入新的RedisSearch索引:

  1. 先创建存储中间结果的索引:
redis-cli FT.CREATE userQuestionCounts ON HASH PREFIX 1 "uqcount:" SCHEMA OwnerUserId NUMERIC NumPreguntas NUMERIC
  1. 执行内层查询并将结果写入新索引:
redis-cli FT.AGGREGATE postsIndex \
  "@PostTypeId:[1 1]" \
  GROUPBY 1 @OwnerUserId \
  REDUCE COUNT 0 AS NumPreguntas \
  # 将结果写入userQuestionCounts索引,前缀为uqcount:
  INTO userQuestionCounts "uqcount:"
  1. 对新索引执行外层分组查询:
redis-cli FT.AGGREGATE userQuestionCounts \
  "*" \
  GROUPBY 1 @NumPreguntas \
  REDUCE COUNT 0 AS NumUsers \
  SORTBY 2 @NumPreguntas ASC \
  LIMIT 0 34

内容的提问来源于stack exchange,提问作者José Adrián Pardo Pérez

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.02 20:02:07