2008-10-10 14 views
9

Tengo una consulta de varias tablas, similar a este (versión simplificada)En mysql, ¿puedes dividir un alias por otro?

SELECT columns, count(table2.rev_id) As rev_count, sum(table2.rev_rating) As sum_rev_rating 
FROM table1 
LEFT JOIN table2 
ON table1.dom_id = table2.rev_domain_from 
WHERE dom_lastreview != 0 AND rev_status = 1 
GROUP BY dom_url 
ORDER BY sum_rev_rating/rev_count DESC 

El problema está en la cláusula ORDER BY. Esto provoca un error de MySQL para mostrar, que es el siguiente:

Referencia 'sum_ calificación REV_' no está soportada (referencia a la función de grupo)

Respuesta

14

usted no es capaz de hacer cálculos con los alias. Una forma de hacer esto sería simplemente crear otro alias y ordenar por eso.

SELECT columns, count(table2.rev_id) As rev_count, sum(table2.rev_rating) As sum_rev_rating, sum(table2.rev_rating)/count(table2.rev_id) as avg_rev_rating 
FROM table1 
LEFT JOIN table2 
ON table1.dom_id = table2.rev_domain_from 
WHERE dom_lastreview != 0 AND rev_status = 1 
GROUP BY dom_url 
ORDER BY avg_rev_rating DESC 
+0

Intenté hacer sum_rev_rating/rev_count COMO avg_rating, pero obtuve el mismo resultado. Supongo que no puedes hacer un alias, de un alias. ¡Tu método funcionó perfectamente! –

+0

No puede usar un alias en otras expresiones en la lista de selección. Puede usar alias solo en las cláusulas GROUP BY, HAVING y ORDER BY. –

1

mi mysql está oxidado; usted puede tratar de

SELECT columns, count(table2.rev_id) As rev_count, 
    sum(table2.rev_rating) As sum_rev_rating, 
    sum(table2.rev_rating)/count(table2.rev_id) as rev_ratio 
FROM table1 
    LEFT JOIN table2ON table1.dom_id = table2.rev_domain_from 
WHERE dom_lastreview != 0 
AND rev_status = 1 
GROUP BY dom_url 
ORDER BY rev_Ratio DESC 

o

SELECT * from (
    SELECT columns, count(table2.rev_id) As rev_count, 
     sum(table2.rev_rating) As sum_rev_rating 
    FROM table1 
     LEFT JOIN table2ON table1.dom_id = table2.rev_domain_from 
    WHERE dom_lastreview != 0 
    AND rev_status = 1 
    GROUP BY dom_url 
) X 
ORDER BY X.sum_rev_rating/X.rev_count DESC 

o

SELECT * from (
    SELECT columns, count(table2.rev_id) As rev_count, 
     sum(table2.rev_rating) As sum_rev_rating, 
     sum(table2.rev_rating)/count(table2.rev_id) as rev_ratio 
    FROM table1 
     LEFT JOIN table2ON table1.dom_id = table2.rev_domain_from 
    WHERE dom_lastreview != 0 
    AND rev_status = 1 
    GROUP BY dom_url 
) X 
ORDER BY rev_Ratio DESC 
Cuestiones relacionadas