2013-02-08 16 views
8

Ok, quindi ho 4 tavoli.MYSQL - Utilizzo di SUM con JOIN

A users tabella con colonne id e name.

Un groups tabella con colonne id, name e owner.

A items tabella con colonne group e content.

A content tabella con colonne id, name e duration.

Ogni utente può disporre di più gruppi. Ogni gruppo può avere diversi oggetti al suo interno. Ogni articolo rappresenta uno dei pezzi di contenuto.

Desidero essere in grado di elencare tutti i gruppi, con una somma di tutte le durate di ciascun contenuto all'interno di quel gruppo.

Che Ive cercato è questo:

select groups.id,groups.name,users.name,sum(content.duration) as duration from groups 
join users on groups.owner=users.id 
join items on items.group=groups.id 
join content on content.id=items.content 

Purtroppo questo mi dà un solo risultato, con una somma totale di tutte le durate di ogni pezzo di contenuti in tutti i gruppi - in questo modo:

"g001", "Group 1", "Me", "400" 

Quello che mi aspetto è qualcosa di simile:

"g001", "Group 1", "Me", "160" 
"g002", "Group 2", "You", "160" 
"g003", "Group 3", "Them", "80" 
+0

può u dare alcuni semplici dati? –

risposta

15

provare questo

select groups.id,groups.name,users.name,sum(content.duration) as duration from groups 
    join users on groups.owner=users.id 
    join items on items.group=groups.id 
    join content on content.id=items.content 
    group by groups.name 
+0

risolto senza dati semplici! grazie molto! – Jimmery

+0

sei il benvenuto! volevo confermare con dati semplici se mi avessi dato :) per mostrarti su demo sqlfiddle. in bocca al lupo ! –

1

Prova questo:

select groups.id,groups.name,users.name,sum(content.duration) as duration 
from groups 
    join users 
     on groups.owner=users.id 
    join items 
     on items.group=groups.id 
    join content 
     on content.id=items.content 
group by groups.id,groups.name,users.name 
1

LEFT JOIN consente di visualizzare tutti i gruppi, anche senza contenuto, ma il valore totale del duration sarà zero.

SELECT a.id, a.name GroupName, 
     d.name OwnerName, 
     SUM(c.duration) totals 
FROM groups a 
     INNER JOIN users d 
      ON a.owner = d.id 
     LEFT JOIN items b 
      ON a.id = b.group 
     LEFT JOIN content c 
      ON b.content = c.id 
GROUP BY a.id, a.name, d.name