2008-10-10 9 views
9

J'ai une requête multi-table, similaire à celle (version simplifiée)Dans mysql, pouvez-vous diviser un alias, par un autre?

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 

Le problème est dans la clause ORDER BY. Cela provoque une erreur de MySQL pour montrer, qui est la suivante:

« Évaluation sum_ de rev_ » Référence non pris en charge (référence à la fonction de groupe)

Répondre

14

Vous n'êtes pas en mesure de faire des calculs avec des alias. Une façon de le faire serait de simplement créer un autre alias et l'ordre par cela.

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

J'ai essayé de faire sum_rev_rating/rev_count AS avg_rating, mais j'ai obtenu le même résultat. Je suppose que vous ne pouvez pas faire un alias, à partir d'un alias. Votre méthode a fonctionné parfaitement! –

+0

Vous ne pouvez pas utiliser un alias dans d'autres expressions de la liste de sélection. Vous pouvez utiliser des alias uniquement dans les clauses GROUP BY, HAVING et ORDER BY. –

1

mon mysql est rouillé; vous pouvez essayer

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 

ou

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 

ou

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 
Questions connexes