如果我在第一个子查询中执行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解决方案: 很抱歉,第一个单个子查询正常工作,服务器问题导致不良行为。
答案 0 :(得分:1)
似乎您希望获得有效产品的评分计数。这是正确的吗?
所以;为什么简单的左联接不起作用? PRA的计数应仅基于活跃的产品;因此索引用法应该在这里起作用。
我需要查看示例数据/预期结果以在此处确定总体目标。
void initState() {
SystemChannels.textInput.invokeMethod('TextInput.hide');
super.initState();
}
替换PR所需的所有字段。*
也许这……似乎是一件很奇怪的事情,但是在完成平均值/计数之前要过滤产品等级。
SELECT PR.*, count(PRA.ID)
FROM products PR
LEFT JOIN productsRating PRA
on PR.ID = PRA.ProductID
WHERE PR.Active = 1
GROUP BY PR.*
答案 1 :(得分:0)
尝试使用不同的计数
SELECT
pr.id, pr.catid, ...
(
SELECT COUNT(Distinct productsrating.id)
FROM productsrating
WHERE pr.id = productid
) as ratingcount,
...
FROM
(
SELECT id, ...
FROM products
WHERE active = 1
) pr