2012-01-28 30 views
5

Mam tabelę użytkowników (użytkowników, przekazów, e-maili) i chcę uzyskać liczbę użytkowników, gdzie użytkownik = 'someuser' i liczbę wiadomości e-mail, gdzie e-mail = "wiadomość" w jednym zapytaniu i wpadłem na to:Wybierz dwa zliczenia w jednym zapytaniu

SELECT (

SELECT COUNT(user) 
FROM users 
WHERE user = 'someuser' 
), (

SELECT COUNT(email) 
FROM users 
WHERE email = 'someemail' 
) 
FROM users 

Ale zastanawiam się, czy jest lepszy sposób na zrobienie tego? Z góry dziękuję :)

+0

Nie sądzę, że posiadanie dwóch kolumn zbiorczych na dwóch różnych tabelach działa bez tego podejścia podkwerendy, więc myślę, że twoje rozwiązanie jest w porządku. – Gregor

+0

spójrz na [tę odpowiedź] (http://stackoverflow.com/a/5177386/944634) –

+0

@ParagBafna: To jest dobre podejście, i zauważam, że wymaga on "promocji" przez MySQL na typy integralne. (Nie wiemy, że RDBMS lam3r4370 to robi.) – pilcrow

Odpowiedz

8

Nie jest to właściwy sposób, aby to zrobić w twoim przypadku. Twoje liczby będą prawdopodobnie zawsze wynosić 0 lub 1 i będą zadowolone z indeksu NC.

W przypadku, gdy chcesz skanować więcej danych, może to być bardziej efektywne, aby zrobić to w ten sposób:

select sum(case when user = 'x' then 1 end) UserCount, sum(case when email = 'x' then 1 end) EmailCount 
from users 

To zawsze będzie skanować tabeli. To zależy od danych, która wersja jest szybsza. W twoim przypadku twój jest szybszy.

+0

Twoje rozwiązanie jest gorsze niż rozwiązanie proponowane w oryginalnym poście. Ponieważ zapytanie powoduje pełne skanowanie tabeli, gdy nie ma klauzuli where. –

+0

@arpf masz rację, że zawsze pojawia się skanowanie tabeli (to niebezpieczne, dlatego nazywam to odpowiedzią). Jednak moja wersja jest lepsza, jeśli skanowanie tabeli było zawsze wymagane. Zauważ też pierwsze zdanie - wspominam o tym kompromisie. – usr

Powiązane problemy