Estoy creando una consulta que realiza algunos filtros en los datos de calificación.Subconsulta de MySQL para referirse al campo en la consulta primaria
Supongamos que tengo una tabla simple llamada ratings
como el siguiente, el almacenamiento de datos de una herramienta de calificación en línea:
+----------------+----------------+--------+ | page_title | timestamp | rating | +----------------+----------------+--------+ | Abc | 20110417092134 | 1 | | Abc | 20110418110831 | 2 | | Def | 20110417092205 | 3 | +----------------+----------------+--------+
necesito para extraer páginas con una alta frecuencia de valores bajos en los últimos 10 notas, y limite esta consulta a páginas que produjeron un volumen de al menos 20 calificaciones en la semana anterior. Esta es la consulta
ridículamente largo
me ocurrió:
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
la consulta de alto nivel busca páginas con más de 20 notas en la semana que termina en 2011-04-24, la subconsulta debe devolver el número de clasificaciones con valores entre [1,2] de las últimas 10 calificaciones de cada artículo de la consulta de nivel superior.
MySQL se queja de que a1.page_title en la cláusula WHERE de la subsubquery es una columna desconocida, sospecho que es porque a1 no está definido como un alias en la consulta de segundo nivel, sino solo en la consulta de nivel superior, pero no tengo ni idea de cómo arreglar esto.
(editado)
Estoy añadiendo como una explicación de mi de sospecha respecto a nivel de referencias cruzadas otra consulta que funciona absolutamente bien, tenga en cuenta que aquí A1 no está definido en la sub consulta, pero es en el precursor inmediato :
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, esta no es una consulta ridículamente larga. Para mí, parece algo corto, de hecho. – MJB
es justo, edité el texto anterior :) – radrat