2016-04-12 12 views
9

Zastanawiałem się, czy ktoś może pomóc z tymMySQL kwerendy z subsort według typu

mam następujące tabele

user_ids { 
    uUID 
    name 
} 

types { 
    tUID 
    name 
} 

activity { 
    aUID 
    user_id 
    type_id 
    date 
} 

więc użytkownicy będą zawierać

uUID name 
1  Bob 
2  Mark 
3  Peter 

rodzajów byłoby

tUID name 
1  Baseball 
2  Football 
3  Cricket 

activit y byłyby

aUID user_id type_id date 
1   1   2 
2   1   2 
3   1   3 
4   2   1 
5   2   3 
6   2   1 
7   3   3 
8   3   3 
9   3   3 

teraz co chciałbym dostać to poniższa tabela powrotem

Name Type  Count of type 
Bob Baseball 0 
Bob Football 2 
Bob Cricket 1 
Mark Baseball 2 
Mark Football 0 
Mark Cricket 1 
Peter Baseball 0 
Peter Football 0 
Peter Cricket 3 

mogę to zrobić z pojedynczego zapytania per ID użytkownika, ale chciałbym wiedzieć, czy istnieje sposób, aby zrób to za pomocą pojedynczego zapytania.

Dzięki

Martin

Odpowiedz

4

Spróbuj tak

z zerowym

SELECT X.Name ,X.Type, 
SUM(CASE WHEN A.user_id IS NULL THEN 0 ELSE 1 END) as `Count of type` 
FROM 
(
    SELECT T.Name AS Type,U.name AS NAME,U.uUID,T.tuid FROM types T,user_ids U 
)X LEFT JOIN activity A ON A.type_id = X.tuid AND A.user_id =X.uUID 
GROUP BY X.Name ,X.Type 
ORDER BY X.Name ,X.Type 

Bez zera

SELECT U.name AS Name, 
     T.name AS Type, 
     SUM(CASE WHEN A.user_id IS NULL THEN 0 ELSE 1 END) as `Count of type` 
FROM types T 
LEFT JOIN activity a on T.tuid=A.type_id 
JOIN user_ids U on A.user_id = U.uUID 
GROUP BY U.name, T.name 
+1

Dzięki temu działało świetnie. – Martin

+0

Instrukcja zero nie zwróci 0, jeśli użytkownik nie wykonał żadnych czynności lub wykonał tylko 1 EG Peter Cricket 3 , ale nic poza tym – Martin

+0

Nie zwróci ani użytkownik wykonał jakąś czynność, czy nie –

0

Rozwiązanie wykorzystuje CROSS JOIN z users i types, potem LEFT JOIN z activity.

select u.name as Name, t.name as Type, COUNT(a.aUID) as `Count of type` 
from users u CROSS JOIN type t 
    LEFT JOIN activity a ON a.user_id = u.uUID AND a.type_id = t.tUID 
2

Trzeba tylko lewy dołączyć rodzaju i aktywności tabel i grupy przez użytkownika i typ:

select u.name as Name, t.name as Type, COUNT(a.user_id) as `Count of type` 
from type t 
left join activity a on t.tuid=a.type_id 
left join users u on a.user_id = u.uUID 
group by u.name, t.name 
Powiązane problemy