2012-04-02 13 views
9

Mam strukturę tabeli, jak pokazano w pierwszej tabeli.Jak zoptymalizować to w MySQL?

Użytkownik chce pobrać zarówno liczby męskie, jak i żeńskie w jednym zapytaniu, aby żądanie trafiło tylko jeden raz na serwer.

How to optimize this in MySQL ?

+0

Uwaga: wiem, jak pobrać wszystkie dane. Ale chcę to zrobić za pomocą optymalizacji – Thompson

+1

+1 Dziękuję za wyraźne pokazanie danych wejściowych i pożądanych wyników. – pilcrow

+0

@pilcrow: Dzięki. – Thompson

Odpowiedz

11

To co trzeba zrobić:

select gender, 
     count(case when age between 0 and 20 then 1 else null end) Age_0_20, 
     count(case when age between 21 and 40 then 1 else null end) Age_21_40 
from yourtable 
group by gender 

Dostosuj odpowiednio :)

Update, z wyjaśnień

Należy pamiętać, że tylko COUNT funkcja agregat nie liczy -null wartości. Dlatego wartości else w case muszą być NULL. Wartość When zwraca 1, ale może to być dowolna wartość inna niż null.

Niektórzy ludzie zaimplementować to za pomocą SUM:

select gender, 
     sum(case when age between 0 and 20 then 1 else 0 end) Age_0_20, 
     sum(case when age between 21 and 40 then 1 else 0 end) Age_21_40 
from yourtable 
group by gender 

Rezultatem będzie absolutnie takie same.

+0

Jego powrocie błąd ** # 1064 - Masz błąd w! twoja składnia SQL; sprawdź instrukcję, która odpowiada twojej wersji serwera MySQL dla właściwej składni do użycia w pobliżu "niż 1 else 0 end) Age_0_19, suma (przypadek, gdy wiek pomiędzy 20 a 40 niż 1 e 'w linii 2 ** – Thompson

+4

Czy po prostu napisałeś' niż 'zamiast' then'? –

+0

Przepraszamy! Napisałem ** niż ** zamiast ** wtedy ** ponieważ już dawało błąd ** # 1064 - Masz błąd w składni SQL, sprawdź instrukcja odpowiadająca twojej wersji serwera MySQL dla właściwej składni do użycia w pobliżu 'group by gender' w linii 4 ** – Thompson

Powiązane problemy