2009-12-05 12 views
2

Étant donné les deux tableaux suivants:Aide avec une requête MySQL

  1. utilisateurs (user_id, nom d'utilisateur, emplacement, email)
  2. votes (user_id, valeur, date, ip)

Comment puis-je effectuer une requête MySQL pour renvoyer tous les utilisateurs avec le nombre total de votes et la somme des votes pour chaque utilisateur?

Merci.

Répondre

3
select u.user_id, 
     (select count(user_id) 
      from votes v 
     where v.user_id = u.user_id) as num_votes, 
     (select sum(value) 
      from votes v 
     where v.user_id = u.user_id) as sum_votes 
    from users u 
# if you want: order by ... 

EDIT: Les sous-sélections ne sont pas la solution la plus élégante et pas vraiment nécessaire. Alors, voici une version jointure externe:

select u.user_id, count(v.user_id) as num_votes, sum(v.value) as sum_votes 
    from users u 
    left outer join votes v 
    on u.user_id = v.user_id 
group by u.user_id 
+1

Dans ce cas, au lieu « gauche jointure externe votes v sur u.user_id = v.user_id » peut utiliser « gauche naturelle rejoins les votes v " – Alex

+0

+1 pour la jointure, pas la sous-sélection. – outis

+1

@Alex: Ou 'REJOIGNEZ les votes AS v en utilisant user_id'. Peu importe lequel. – outis

0

Cela fonctionne pour moi:

create table user 
(
    id int not null auto_increment, 
    name varchar(80) not null, 
    location varchar(80) default '', 
    email varchar(80) default '', 
    primary key(id) 
); 

create table vote 
(
    id int not null auto_increment, 
    count int not null, 
    election_date date, 
    user_id int, 
    primary key(id), 
    foreign key(user_id) references user(id) 
); 

select 
user.name, user.email, sum(vote.count) 
from user 
left join 
vote 
on user.id = vote.user_id 
group by (user_id)