2013-06-10 16 views
30

Quello che voglio fare è SUM una colonna, ma anche CONTA il numero di righe che somma, con un limite di non più di 5 righe. Quindi la mia domanda è:COUNT MySQL con LIMIT

SELECT COUNT(*), SUM(score) FROM answers WHERE user=1 LIMIT 5 

quello che mi aspettavo di nuovo ero un COUNT (*) fino a 5 (non posso solo supporre che sarà sempre 5 nella mia logica codice come potrebbe avere meno di 5 risposte), con una somma del punteggio dello fino a 5 righe.

Invece quello che sembra tornare è il numero totale di righe corrispondenti (dove utente è 1) come il conteggio e la somma del punteggio per quelle righe. I numeri non cambiano se ho messo LIMIT 1 o LIMIT 5 o anche limitare 50.

quello che credo funzionerà in questa situazione è questa, invece

SELECT COUNT(*), SUM(score) FROM (SELECT * FROM answers WHERE user=1 LIMIT 5) AS a 

Ma che sembra un po 'contorto per una semplice query come e siccome è in uno script di traffico elevato, non voglio che sia il più performante possibile.

Mi manca qualcosa? Ho trovato questo bug report di qualche anno fa che sembra essere collegato a questo "problema" http://bugs.mysql.com/bug.php?id=50005 ma suppongo che non sia in realtà un bug?

+4

'LIMIT 5' restituirà al massimo 5 righe. 'SELECT COUNT (*), SUM (punteggio) FROM answers' restituirà 1 riga. 1 <5. È corretto nella seconda query. –

+0

Yep @ ta.speot.is, penso di aver solo bisogno di qualcuno per verificare che non stavo facendo qualcosa di stupido. Avrei potuto giurare che c'era una query più semplice per fare ciò di cui avevo bisogno, ma ovviamente no. – Lee

+2

usando 'select 1' invece di' select * 'nella query nidificata può teoricamente portare a un minor utilizzo di memoria –

risposta

30

Questo è in realtà il modo in cui la query funziona ed è un comportamento normale. Utilizzando LIMIT non si limiterà il conteggio o la somma ma solo le righe restituite. Quindi la tua query restituirà le righe n come indicato nella clausola LIMIT. E poiché la tua query restituisce effettivamente solo una riga, l'applicazione di un limite (diverso da zero) non ha alcun effetto sui risultati.

Tuttavia, la seconda query funzionerà come previsto ed è un modo consolidato per risolvere questo problema.

+0

Accetterò la risposta una volta che il timer SO me lo consente. Ma hai ragione, penso di aver solo bisogno di qualcun altro per spiegarlo anch'io, quindi sapevo che non stavo facendo qualcosa di sciocco. La seconda query funziona e sembra essere l'unico modo per farlo. – Lee

+0

@Lee è corretto, sono contento di averti aiutato – Fabio