相关子查询"未知列"

时间:2016-09-03 21:20:39

标签: mysql correlated-subquery

我在以下查询中获得Unknown column 'sites.id' in 'where clause'

SELECT id, COUNT( returning_visitors.per_ip ) as readers, AVG( returning_visitors.per_ip ) as avg_visits_pr
FROM sites
JOIN (
    SELECT COUNT( * ) AS per_ip
    FROM site_hits_unique
    WHERE site_id = sites.id
    AND date >= CURDATE( ) - INTERVAL 30 DAY
    GROUP BY site_id, ip
    HAVING per_ip > 1
) AS returning_visitors
WHERE id IN (162888, 42705, 11412)

我想为每个sites.id运行内部查询(该示例仅使用一些ID进行测试)。

相关子查询只有一个级别,所以我不太确定为什么它没有得到sites.id

任何想法如何解决?

2 个答案:

答案 0 :(得分:2)

您应该以下列方式重写查询:

SELECT id, COUNT( returning_visitors.per_ip ) as readers, AVG( returning_visitors.per_ip ) as avg_visits_pr
FROM sites
JOIN (
    SELECT COUNT( * ) AS per_ip, site_id
    FROM site_hits_unique
    WHERE site_id IN (162888, 42705, 11412)
    AND date >= CURDATE( ) - INTERVAL 30 DAY
    GROUP BY site_id, ip
    HAVING per_ip > 1
) AS returning_visitors
on id=returning_visitors.site_id
WHERE id IN (162888, 42705, 11412)

答案 1 :(得分:2)

我从http://dev.mysql.com/doc/refman/5.6/en/subquery-restrictions.html找到了原因:

  

FROM子句中的子查询不能是相关子查询。他们   在整个过程中实现了(被评估以产生结果集)   查询执行,因此无法对外部的每一行进行求值   查询。在MySQL 5.6.3之前,实现之前的实现   评估外部查询。从5.6.3开始,优化器会延迟   物化,直到需要结果,这可能允许   物化是要避免的。请参见第8.2.1.18.3节“优化   FROM子句中的派生表(子查询)“。

虽然我仍然需要弄清楚如何重写我的查询以使其按照我想要的方式工作。这是一个必要/可行的功能吗?