性能:双嵌套子查询未知列

时间:2019-05-28 09:02:11

标签: mysql

如果我在第一个子查询中执行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解决方案: 很抱歉,第一个单个子查询正常工作,服务器问题导致不良行为。

2 个答案:

答案 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