2010-05-15 4 views
3

J'ai 2 tables: Utilisateur et Image. La table d'image a la clé de l'utilisateur. Donc, fondamentalement, chaque utilisateur peut avoir plusieurs images, et chaque image appartient à un utilisateur. Maintenant, j'essaye de faire la requête suivante: Je veux sélectionner toutes les informations d'utilisateur plus le nombre total d'images qu'il a (même si c'est 0). Comment puis je faire ça? Probablement cela semble assez simple, mais j'essaie et j'essaie et je n'arrive pas à trouver la bonne question. La seule chose que je pourrais sélectionner est cette information, mais seulement pour les utilisateurs qui ont au moins une image, ce qui signifie que la table Pictures a au moins un enregistrement pour cette clé ... Mais je veux aussi considérer les utilisateurs qui n'en ont pas . Une idée? Merci!Requête MySQL: tous les enregistrements d'une table plus le compte d'une autre table

+0

S'il vous plaît publier la requête que vous avez jusqu'à présent. –

Répondre

7

Vous pouvez essayer ce qui suit:

SELECT u.name, 
      IFNULL(sub_p.total, 0) num 
FROM  users u 
LEFT JOIN (SELECT COUNT(*) total, user_id 
      FROM  pictures 
      GROUP BY user_id 
     ) sub_p ON (sub_p.user_id = u.user_id); 

Cas de test:

CREATE TABLE users (user_id int, name varchar(10)); 
CREATE TABLE pictures (user_id int); 

INSERT INTO users VALUES (1, 'Joe'); 
INSERT INTO users VALUES (2, 'Peter'); 
INSERT INTO users VALUES (3, 'Bill'); 

INSERT INTO pictures VALUES (1); 
INSERT INTO pictures VALUES (1); 
INSERT INTO pictures VALUES (2); 
INSERT INTO pictures VALUES (2); 
INSERT INTO pictures VALUES (2); 

Résultat:

+-------+-----+ 
| name | num | 
+-------+-----+ 
| Joe | 2 | 
| Peter | 3 | 
| Bill | 0 | 
+-------+-----+ 
3 rows in set (0.00 sec) 
+0

Parfait! Merci! – Ricardo

+0

est le GROUP BY requis? – vulkanino

+0

@vulkanino: Non, vous avez raison. Ce n'est pas nécessaire. Cependant, je préfère avoir un «GROUP BY» explicite chaque fois que j'ai une fonction d'agrégat. Je trouve plus facile de comprendre la requête. –

2
SELECT u.name, COUNT(p.picture) AS number 
FROM User u 
LEFT JOIN Picture p 
    ON u.id = p.userid 
GROUP BY p.userid 
Questions connexes