2013-06-10 22 views
30

Co chcę zrobić, to SUMA kolumna, ale także COUNT liczbę zsumowanych wierszy, z limitem nie więcej niż 5 wierszy. Więc moje zapytanie jest:LICZBA MySQL z LIMITEM

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

czego się spodziewałem z powrotem był COUNT (*) do 5 (nie mogę po prostu założyć, że zawsze będzie na 5 w moim kodu logiki, jak to może mieć mniej niż 5 odpowiedzi), z suma wyniku w liczbie od do 5 rzędów.

Zamiast tego, wydaje się, że wracam, to całkowita liczba pasujących wierszy (gdzie użytkownik jest 1) jako liczba i suma wyniku dla tych wierszy. Liczby nie zmieniaj czy mogę umieścić graniczna 1 lub ograniczyć 5 lub nawet ograniczyć 50.

co wierzę będzie działać w tej sytuacji jest to zamiast

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

Ale to wydaje się trochę zawiłe dla takiego prostego zapytania , a ponieważ jest w scenariuszu o dużym natężeniu ruchu, nie powinien być tak wydajny, jak to tylko możliwe.

Czy brakuje mi czegoś? Znalazłem ten raport o błędzie sprzed kilku lat, który wydaje się być związany z tym "problemem" http://bugs.mysql.com/bug.php?id=50005, ale zakładam, że to nie jest błąd?

+4

'LIMIT 5' zwróci najwyżej 5 wierszy. 'SELECT COUNT (*), SUM (score) FROM answers' zwróci 1 wiersz. 1 <5. Masz poprawność w drugim zapytaniu. –

+0

Yep @ ta.speot.is, myślę, że potrzebowałem kogoś do zweryfikowania, że ​​nie robiłem czegoś głupiego. Mogłem przysiąc, że było prostsze zapytanie, żeby zrobić to, czego potrzebowałem, ale oczywiście nie. – Lee

+2

użycie 'select 1' zamiast' select * 'w zapytaniu zagnieżdżonym może teoretycznie doprowadzić do zmniejszenia użycia pamięci –

Odpowiedz

30

To tak działa zapytanie i jest to normalne zachowanie. Użycie numeru LIMIT nie ograniczy liczby ani sumy, a jedynie zwróconych wierszy. Tak więc zapytanie zwróci wiersze n zgodnie z klauzulą ​​LIMIT. A ponieważ zapytanie faktycznie zwraca tylko jeden wiersz, zastosowanie (niezerowego) limitu nie ma wpływu na wyniki.

Twoje drugie zapytanie będzie działać zgodnie z oczekiwaniami i jest ustalonym sposobem rozwiązania tego problemu.

+0

Przyjmę odpowiedź, gdy mi pozwoli timer czasu SO. Ale masz rację, myślę, że potrzebowałem kogoś, kto by mi to wyjaśnił, więc wiedziałem, że nie robię czegoś głupiego. Drugie zapytanie działa i wydaje się, że jest to jedyny sposób na zrobienie tego. – Lee

+0

@ Sprawdź, czy to prawda, cieszę się, że ci pomogłem – Fabio