Come utilizzare una colonna con alias in una clausola WHERE di MySQL?
Domanda
Ho una query MySQL come questa:
SELECT *, SUM(...some SQL removed for brevety) AS Occurrences FROM some_table AS q
WHERE criterion="value" GROUP BY q.P_id ORDER BY Occurrences DESC LIMIT 10;
Voglio limitare i risultati alle righe in cui Occurrences > 0. Mi sembra molto semplice, ma non riesco a farlo funzionare. Indipendentemente da ciò che provo, DOVE O DOVUTO, ogni volta che provo ad aggiungere questa limitazione non ricevo NESSUNA LINEA. Sono sicuro che ci sono dati nella mia tabella che dovrebbero essere restituiti. Qualcuno sa come realizzare quello che sto facendo?
Ho provato questo, ma non funziona ancora. Qualche idea sul perché non funzionerà ancora?
SELECT *, SUM(...some SQL removed for brevety) AS Occurrences FROM some_table AS q
WHERE criterion="value" HAVING SUM(...some SQL removed for brevety)>0 GROUP BY q.P_id ORDER BY Occurrences DESC LIMIT 10;
Soluzione
Non ho familiarità con MySQL come lo sono con SQL Server, ma in T-SQL, non è possibile utilizzare gli alias nelle clausole GROUP BY (inizialmente pensavo anche le clausole ORDER BY, ma da allora è stato dimostrato che essere errato). In questo caso, vuoi filtrare in base ai risultati di GROUP BY, quindi vorrei utilizzare una clausola HAVING come segue:
SELECT *, SUM(... some SQL removed for brevity ...) AS Occurrences
FROM
some_table AS q
WHERE
criterion = 'value'
GROUP BY
q.P_id
HAVING
SUM(... some SQL removed for brevity ...) > 0
ORDER BY
Occurrences DESC
LIMIT 10;
Altri suggerimenti
Questa query funziona per me ...
select order_id, sum(qty_ordered) as total_qty
from sales_flat_order_item
group by order_id
having total_qty > 10
order by total_qty desc
Ah, ho trovato il posto giusto per questo.
La dichiarazione è ora:
SELECT *, SUM(...some SQL removed for brevety) AS Occurrences FROM some_table AS q
WHERE criterion="value" GROUP BY q.P_id HAVING SUM(...some SQL removed for brevety)>0 ORDER BY Occurrences DESC LIMIT 10;
Sembra funzionare bene con ORDER BY Occurrences,
Credo che gli aggregati dovrebbero essere nella clausola HAVING
. Tuttavia, è vero, non sono sicuro che gli alias siano accettati.
HAVING (Occurrences > 0)
HAVING (SUM(...some SQL removed for brevety) > 0)
In alternativa, è possibile utilizzare una query secondaria:
SELECT *
FROM (
-- your current query
) AS sub
WHERE (Occurences > 0)
Secondo lo standard SQL, gli alias di colonna non sono disponibili nel corpo della query, il che è un fastidio confuso. Dato quello che hai provato, sembra che lo stesso sia vero per MySQL (e alcuni altri DBMS). Probabilmente dovrai ripetere l'espressione nella clausola ORDER BY.
Inoltre, la clausola GROUP BY dovrebbe elencare ogni colonna che si trova nella *, non solo la chiave primaria (sebbene, logicamente, specificare la chiave primaria dovrebbe essere sufficiente).