Я создаю запрос, который выполняет некоторую фильтрацию данных рейтинга.
Предположим, у меня есть простая таблица с именем 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,Подзапрос должен извлекать число оценок со значениями между [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