如何用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索引:
- 先创建存储中间结果的索引:
redis-cli FT.CREATE userQuestionCounts ON HASH PREFIX 1 "uqcount:" SCHEMA OwnerUserId NUMERIC NumPreguntas NUMERIC
- 执行内层查询并将结果写入新索引:
redis-cli FT.AGGREGATE postsIndex \ "@PostTypeId:[1 1]" \ GROUPBY 1 @OwnerUserId \ REDUCE COUNT 0 AS NumPreguntas \ # 将结果写入userQuestionCounts索引,前缀为uqcount: INTO userQuestionCounts "uqcount:"
- 对新索引执行外层分组查询:
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
相关产品推荐
相关产品推荐

