MySQL子查询引用父查询中的字段

rad*_*rat 12 mysql subquery

我正在构建一个对评级数据执行一些过滤的查询.

假设我有一个简单的表ratings,如下所示,存储来自在线评级工具的数据:

+----------------+----------------+--------+
| page_title     | timestamp      | rating |
+----------------+----------------+--------+
| Abc            | 20110417092134 | 1      |
| Abc            | 20110418110831 | 2      |
| Def            | 20110417092205 | 3      |
+----------------+----------------+--------+

我需要在最新的10个评级中提取具有高频率低值的页面,并将此查询限制为在前一周产生至少20个评级的页面.这是我提出的非常长的查询:

SELECT a1.page_title, COUNT(*) AS rvol, AVG(a1.rating) AS theavg, 
(
     SELECT COUNT(*) FROM
     (
         SELECT * FROM ratings a2 WHERE a2.page_title = a1.page_title 
         AND DATE(timestamp) <= '2011-04-24' ORDER BY timestamp DESC LIMIT 10
     ) 
     AS latest WHERE rating >=1 AND rating <=2 ORDER BY timestamp DESC
)
AS lowest FROM ratings a1
WHERE DATE(a1.timestamp) <= "2011-04-24" AND DATE(a1.timestamp) >= "2011-04-17" 
GROUP BY a1.page_title HAVING COUNT(*) > 20
Run Code Online (Sandbox Code Playgroud)

顶级查询查找在2011-04-24本周终端超过20个收视率,子查询应该与之间的值获取收视号[1,2]从每一篇文章的最新10条点评顶级查询.

MySQL抱怨子查询的WHERE子句中的a1.page_title是一个未知列,我怀疑这是因为a1在第二级查询中没有被定义为别名,而只是在顶级查询中,但我无能为力如何解决这个问题.

(编辑)的

我加入我的犯罪嫌疑人上面关于跨级引用另一个查询其作品精绝的说明,注意这里A1没有在子查询定义,但它是在直接父:

SELECT a1.page_title, COUNT(*) AS rvol, AVG(a1.rating) AS theavg, 
(
    SELECT COUNT(*) FROM ratings a2 WHERE DATE(timestamp) <= '2011-04-24'
    AND DATE(timestamp) >= '2011-04-17' AND rating >=1 
    AND rating <=2 AND a2.page_title = a1.page_title
) AS lowest FROM ratings a1 
WHERE DATE(a1.timestamp) <= '2011-04-17' AND DATE(a1.aa_timestamp) >= '2011-04-11' 
GROUP BY a1.page_title HAVING COUNT(*) > 20
Run Code Online (Sandbox Code Playgroud)

Con*_*rix 5

我想你可能会考虑加入两个在线视图,它可能会让事情变得更好.

SELECT * 
FROM   (SELECT COUNT(*), 
               a2.page_title 
        FROM   ratings a2 
        WHERE  DATE(timestamp) <= '2011-04-24' 
               AND DATE(timestamp) >= '2011-04-17' 
               AND rating >= 1 
               AND rating <= 2 

        GROUP  BY a2.page_title) current 
       JOIN 
        (SELECT a1.page_title, 
                    COUNT(*)       AS rvol, 
                    AVG(a1.rating) AS theavg 
             FROM   ratings a1 
             WHERE  DATE(a1.timestamp) <= '2011-04-17' 
                    AND DATE(a1.a_timestamp) >= '2011-04-11' 
             GROUP  BY a1.page_title 
             HAVING COUNT(*) > 20) morethan20 
         ON current .page_title = morethan20.page_title 
Run Code Online (Sandbox Code Playgroud)