1

这是我真实而复杂的查询的简化版本,它有很多连接。

SELECT 
    (SELECT AVG(height) FROM users u2 WHERE u2.id IN u1.id)
FROM users u1
WHERE created > '2013-01-01'
GROUP BY state

子查询是不起作用的部分,因为 u1.id 是一个聚合值。我真正想做的是将所有聚合值作为列表查询。我可以这样做:

(SELECT AVG(height) FROM users u2 WHERE FIND_IN_SET(u2.id,GROUP_CONCAT(DISTINCT u1.id)))) 

但是字符串解析效率低下,不能使用索引,并且与 MySQL 的 group_concat_max_len 默认值只有 1024 相冲突。

另一种解决方案是将内部查询转换为外部查询的镜像,但这最终太慢了。不幸的是,我不能偏离这个查询结构太远,因为查询是基于用户对许多过滤选项的选择以编程方式构建的。

编辑:另一种形式是执行 AVG(DISTINCT u1.id, height) 之类的操作,它采用具有不同 user.id 的行的平均高度,但这也不支持。

4

0 回答 0