我正在构建一个查询,对评级数据执行一些过滤。MySQL子查询引用父查询中的字段
假设我有一个简单的表称为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
顶级查询查找在本周终止20余个评级2011-04-24网页,子查询应该检索来自顶级查询中每篇文章的最新10条评级的值为[1,2]之间的评级数。
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
FWIW,这不是一个可笑的长查询。对我而言,事实上它似乎有点短。 – MJB 2011-04-25 18:07:12
够公平的,我编辑了上面的文字:) – radrat 2011-04-26 00:05:28