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;
È stato utile?

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).

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top