【发布时间】:2019-10-13 18:23:02
【问题描述】:
如果我在第一个子查询中执行 COUNT()/AVG(),mysql 会处理表中的所有行,因此有必要使用另一个子查询从所有行中过滤。
例如,如果我有 3 行,但只有 1 行的 id 应该得到计数,mysql 会处理所有 3 行(根据 EXPLAIN)并在之后执行 where 子句。
如果我能够在双嵌套子查询中选择这一行并在外部调用计数,那么性能会好得多。
问题mysql不允许在二级子查询中使用外部值。
我的代码的简单示例:
SELECT
pr.id, pr.catid, ...
(
SELECT COUNT(pra.id)
FROM (
SELECT id
FROM productsrating
WHERE pr.id = productid
) pra
) as ratingcount,
...
FROM
(
SELECT id, ...
FROM products
WHERE active = 1
) pr
-> 未知列 pr.id
我也尝试在主选择中使用 COUNT,但不允许在子查询中包含多个值。
编辑:我在 productid 上有一个索引。
EDIT2 解决方案: 抱歉,第一个子查询运行良好,服务器问题导致了不良行为。
【问题讨论】:
-
将
pr.id = productid替换为id = productid -
pr.id 是表 products 的 id,如果我使用 'id' 它会从表 productsrating 中获取 id
-
不,它不能。
JOIN怎么样? -
向我们展示您的表结构
-
@tcadidot0 如果我做一个简单的加入并调用 avg 或计算相同的结果,
标签: mysql