2008-12-13 14 views
54

Mam zapytanie do skutkuUzyskiwanie liczbę wierszy z GROUP BY zapytania

SELECT t3.id, a,bunch,of,other,stuff FROM t1, t2, t3 
WHERE (associate t1,t2, and t3 with each other) 
GROUP BY t3.id 
LIMIT 10,20 

chcę wiedzieć do wielu sumy wierszy ta kwerenda wróci bez limitu (więc mogę pokazać informacje paginacji).

Normalnie używam tej kwerendy:

SELECT COUNT(t3.id) FROM t1, t2, t3 
WHERE (associate t1,t2, and t3 with each other) 
GROUP BY t3.id 

Jednak GROUP BY zmienia znaczenie hrabiego, a zamiast tego dostaję zestaw wierszy reprezentujących liczbę unikatowych wartości t3.id w każdej grupie .

Czy istnieje sposób na uzyskanie liczby całkowitej liczby wierszy, gdy korzystam z GROUP BY? Chciałbym uniknąć konieczności wykonywania całego zapytania i po prostu zliczania liczby wierszy, ponieważ potrzebuję tylko podzestawu wierszy, ponieważ wartości są paginowane. Używam MySQL 5, ale myślę, że to całkiem ogólne.

+0

[Użyj podkwerend do liczenia odrębnego 50x szybciej.] (Https: // www.periscopedata.com/blog/use-subqueries-to-count-distinct-50x-faster.html) – bishop

Odpowiedz

53

Jest miły rozwiązanie w MySQL.

Dodać SQL_CALC_FOUND_ROWS słów kluczowych tuż po słowie kluczowym SELECT:

SELECT SQL_CALC_FOUND_ROWS t3.id, a,bunch,of,other,stuff FROM t1, t2, t3 
WHERE (associate t1,t2, and t3 with each other) 
GROUP BY t3.id 
LIMIT 10,20 

potem uruchomić kolejne zapytanie z FOUND_ROWS function():

SELECT FOUND_ROWS(); 

Należy zwrócić liczbę wierszy bez Klauzula LIMIT.

Zamówienie aktualizacja Więcej informacji: http://dev.mysql.com/doc/refman/5.0/en/information-functions.html#function_found-rows

+3

Z uwagi na to, że nie dokonałem testu porównawczego połączeń, ten artykuł wyłączył mnie z rozwiązania: http: // www .mysqlperformanceblog.com/2007/08/28/to-sql_calc_found_rows-or-not-to-sql_calc_found_rows/ –

+0

Zamiast wykonywać wiele zapytań, prosimy http://stackoverflow.com/a/364838/631652 o odpowiedź Toma. – Parixit

50

są „masa innych rzeczy” wszystkich agregatów? Zakładam, że tak, ponieważ twoja grupa GROUP BY ma tylko t3.id. Jeśli to przypadek wówczas powinno to działać:

SELECT 
    COUNT(DISTINCT t3.id) 
FROM... 

Inną opcją jest oczywiście:

SELECT 
    COUNT(*) 
FROM 
    (
    <Your query here> 
    ) AS SQ 

nie używam MySQL, więc nie wiem, czy te pytania będą tam pracować lub nie.

+2

W MySQL będzie to błąd, ale może to być dobre rozwiązanie, jeśli dodasz alias do wygenerowanej tabeli. W przeciwnym razie pojawi się błąd: "Każda wyprowadzona tabela musi mieć swój własny alias". Pamiętaj więc, aby napisać coś w stylu: wybierz liczbę (*) z (zapytanie) jako wynikTabela – Kennethvr

+0

Dzięki za heads-up. Dokonałem edycji. –

+5

działa dla mnie w MySQL. – quano

12

Korzystanie z kwerend sub:

SELECT COUNT(*) FROM  
(
SELECT t3.id, a,bunch,of,other,stuff FROM t1, t2, t3 
WHERE (associate t1,t2, and t3 with each other) 
GROUP BY t3.id 
)  
as temp; 

więc temp zawiera liczbę wierszy.

1

Wszystkie podane dane wykonają zapytanie, a następnie odliczą. Wyraźny jest zdecydowanie wolniejszy niż grupa na dużym zbiorze danych.

Najlepszy sposób, aby znaleźć rachubę grupy, jest poniżej

SELECT 
    sum(1) as counttotal 
FROM (
    Your query with group by operator 
) as T 

Pozwoli to znaleźć rachubę przy obliczaniu przez grupę.