2011-08-01 18 views
9

to pytanie zadane przez Ryana Franka na forums.mysql.com, z którym również stoję.WHERE klauzula wewnątrz COUNT (DISTINCT) klauzula

Mam następujący na początku mojego SELECT:

SELECT accounts.id, accounts.company, accounts.first, accounts.last, 
COUNT(DISTINCT accounts_log.login_time) AS visits, 
COUNT(DISTINCT accounts_log.ip_address) AS visitors, 
COUNT(DISTINCT documents_log.access_time) AS docs, 
MAX(accounts_log.login_time) AS login_time 
FROM accounts 

ta zwraca wszystkie zmienne muszę; jednak chcę ograniczyć zmienne, które używają COUNT (DISTINCT) do zakresu dat. Nie mogę użyć klauzuli WHERE po klauzuli FROM. Na przykład:

FROM accounts 
WHERE accounts_log.login_time >='$search_from' AND accounts_log.login_time <='$search_to' 

nie będzie działać, ponieważ nie dałoby mi wszystkich kont, których potrzebuję.

szukam czegoś podobnego:

COUNT(DISTINCT accounts_log.login_time WHERE accounts_log.login_time >='$search_from' AND accounts_log.login_time <='$search_to') AS visits 

PS: Wiem, że powyższe nie działa i skończyły się opcje składni.

+0

Nie pokazujesz nam całego zapytania. Skąd pochodzi tabela 'accounts_log'? –

+0

Załóżmy, że możesz zamienić account_log na konta – eyaler

Odpowiedz

8
SELECT accounts.id, accounts.company, accounts.first, accounts.last, 
COUNT(DISTINCT case when accounts_log.login_time >='$search_from' AND accounts_log.login_time <='$search_to' then accounts_log.login_time else null end) AS visits, 
COUNT(DISTINCT case when accounts_log.login_time >='$search_from' AND accounts_log.login_time <='$search_to' then accounts_log.ip_address else null end) AS visitors, 
COUNT(DISTINCT case when accounts_log.login_time >='$search_from' AND accounts_log.login_time <='$search_to' then documents_log.access_time else null end) AS docs, 
MAX(accounts_log.login_time) AS login_time 
FROM accounts 
+0

super, teraz powiedz, że potrzebuję wielu różnych w liczeniu, tj .: count (odrębny account_log.ip_address1, accounts_log.ip_address2) pod warunkiem czasu. próbowałem: COUNT (DISTINCT case, gdy account_log.login_time> = '$ search_from' AND accounts_log.login_time <= '$ search_to' then (accounts_log.ip_address1, accounts_log.ip_address2) else null end) AS odwiedzający ale to nie działa – eyaler

+0

zakończył działanie: COUNT (DISTINCT (przypadek, gdy account_log.login_time> = '$ search_from' AND accounts_log.login_time <= '$ search_to' then accounts_log.ip_address1 else null end), (case when accounts_log.login_time> = '$ search_from 'AND accounts_log.login_time <=' $ search_to 'then accounts_log.ip_address2 else null end)) AS odwiedzających – eyaler

0

można postawić warunek w klauzuli ONLEFT JOIN:

SELECT a.id, a.company, a.first, a.last, 
COUNT(DISTINCT al.login_time) AS visits 
FROM accounts a 
LEFT JOIN accounts_log al ON (al.account_id = a.id AND 
al.login_time BETWEEN '$search_from' AND '$search_to') 

i to samo z innymi tabelami.