Подзапрос MySQL для ссылки на поле в родительском запросе

Я создаю запрос, который выполняет некоторую фильтрацию данных рейтинга.

Предположим, у меня есть простая таблица с именем рейтинги , подобная следующей, хранящая данные из онлайн-инструмента оценки:

+----------------+----------------+--------+
| 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 оценками за неделю, заканчивающуюся 24 апреля 2011 г., подзапрос должен получить количество оценок со значениями между [1,2] из последних 10 оценок каждой статьи из запроса верхнего уровня.

MySQL жалуется, что a1.page_title в предложении WHERE подзапроса является неизвестным столбцом, я подозреваю, что это потому что 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
12
задан radrat 25 April 2011 в 20:14
поделиться