关联RankedPage表时子查询统计列keyword_count无法显示的问题求助
问题描述
执行子查询统计匹配关键词的数量后关联RankedPage表,发现统计字段keyword_count没有被纳入最终结果列。查看生成的SQL,子查询本身已经包含该统计列,但关联后结果里不显示;尝试用subQuery[keywordCount]引用时,还会报错提示列不存在。
代码示例
val keywordCount = KeywordTable.word.count() val keywordCountQuery = PageKeywordTable.join(KeywordTable, JoinType.INNER, PageKeywordTable.keywordId, KeywordTable.id) .slice(PageKeywordTable.rankedPageId, keywordCount.alias("keyword_count")) .select { KeywordTable.word inList listOf("foo", "bar") }.groupBy(PageKeywordTable.rankedPageId) .having { keywordCount greaterEq 1 } val subQuery = keywordCountQuery.alias("subQuery") val pages = db.transaction { addLogger(StdOutSqlLogger) val columns = RankedPageTable.columns + subQuery.columns Join(RankedPageTable).join(subQuery, JoinType.INNER, RankedPageTable.id, subQuery[PageKeywordTable.rankedPageId]) .slice(columns) .selectAll() .toList() }
问题细节
生成的子查询SQL片段:
... SELECT page_keyword.ranked_page_id, COUNT(keyword.word) keyword_count ...
解决方案
问题核心是原统计对象keywordCount和子查询里的别名列keyword_count不是同一个引用,直接用原对象查找会匹配失败,有两种解决办法:
方法1:提前保存别名列的引用
在定义子查询时,先把别名后的统计列存起来,后续通过子查询直接引用这个保存的对象:
// 提前保存别名后的统计列对象 val keywordCountAlias = keywordCount.alias("keyword_count") val keywordCountQuery = PageKeywordTable.join(KeywordTable, JoinType.INNER, PageKeywordTable.keywordId, KeywordTable.id) .slice(PageKeywordTable.rankedPageId, keywordCountAlias) // 使用别名列对象 .select { KeywordTable.word inList listOf("foo", "bar") }.groupBy(PageKeywordTable.rankedPageId) .having { keywordCount greaterEq 1 } val subQuery = keywordCountQuery.alias("subQuery") val pages = db.transaction { addLogger(StdOutSqlLogger) // 直接通过子查询引用保存的别名列 val columns = RankedPageTable.columns + listOf(subQuery[keywordCountAlias]) Join(RankedPageTable).join(subQuery, JoinType.INNER, RankedPageTable.id, subQuery[PageKeywordTable.rankedPageId]) .slice(columns) .selectAll() .toList() }
方法2:通过别名的字符串名称获取
如果不想提前保存,也可以直接用列的别名字符串"keyword_count"来从子查询中获取列,注意要根据实际类型做转换:
val pages = db.transaction { addLogger(StdOutSqlLogger) // 明确指定子查询要返回的列:关联ID和统计列 val subQueryColumns = listOf( subQuery[PageKeywordTable.rankedPageId], subQuery["keyword_count"] as Column<Long> // 替换成你实际的统计值类型 ) val columns = RankedPageTable.columns + subQueryColumns Join(RankedPageTable).join(subQuery, JoinType.INNER, RankedPageTable.id, subQuery[PageKeywordTable.rankedPageId]) .slice(columns) .selectAll() .toList() }
内容的提问来源于stack exchange,提问作者JeffgNpc
相关产品推荐
相关产品推荐

