2008-10-10 8 views
9

Mam zapytanie multi-table, podobny do tego (w wersji uproszczonej)W mysql, możesz podzielić jeden alias, przez inny?

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 

Problem jest w klauzuli ORDER BY. Powoduje to błąd mysql, aby zobaczyć, co jest w następujący sposób:

odniesienia 'sum_ rev_ ocena' nie jest obsługiwana (odniesienie do grupy funkcyjnej)

Odpowiedz

14

Nie jesteś w stanie wykonywać obliczenia z aliasów. Jednym ze sposobów na zrobienie tego byłoby po prostu stworzenie kolejnego aliasu i porządku przez to.

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

Próbowałem robić sum_rev_rating/rev_count AS avg_rating, ale otrzymałem ten sam wynik. Chyba nie możesz zrobić pseudonimu z aliasu. Twoja metoda działała bez zarzutu! –

+0

Nie można używać aliasu w innych wyrażeniach na liście select. Aliasów można używać tylko w klauzulach GROUP BY, HAVING i ORDER BY. –

1

mój mysql jest zardzewiały; możesz spróbować

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 

lub

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 

lub

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 
Powiązane problemy