2 votes

Obtenez tous les utilisateurs même s'il n'y a aucun enregistrement dans une autre table

Je rencontre un problème ici :

J'ai deux tables :

Une table users :

+----+---------------+----------+
| id | username      | company  |
+----±---------------±----------+
| 1  | John          | 0        |
| 2  | Jack          | 0        |
| 3  | Casimir       | 0        |
±----±---------------±----------±

Une table orders :

+----+---------------+----------+--------+
| id | date          | iduser   | status |
+----±---------------±----------+--------+
| 1  | 2012-05-28    | 1        | 1      |
| 2  | 2012-05-25    | 1        | 1      |
| 3  | 2012-04-28    | 2        | 1      |
| 4  | 2012-03-28    | 1        | 1      |
| 5  | 2012-02-28    | 2        | 0      |
±----±---------------±----------±--------+

Ce que j'essaie de faire est d'obtenir un résultat comme celui-ci :

+----------+---------------+-------------+
| username | COUNT(order)  | MAX(date)   |
+----------±---------------±-------------+
| John     | 3             | 2012-05-28  |
| Jack     | 1             | 2012-04-28  |
| Casimir  | 0             | NULL        |
±----------±---------------±-------------±

Voici la requête que j'ai pour le moment :

SELECT u.username, COUNT(o.id), MAX(o.date)
FROM users u
INNER JOIN orders o ON u.id = o.iduser
WHERE o.status = 1
GROUP BY u.id

Cette requête me donne un résultat comme :

+----------+---------------+-------------+
| username | COUNT(order)  | MAX(date)   |
+----------±---------------±-------------+
| John     | 3             | 2012-05-28  |
| Jack     | 1             | 2012-04-28  |
±----------±---------------±-------------±

Comme vous pouvez le voir, l'utilisateur Casimir n'est pas affiché car il n'a passé aucune commande. Comment puis-je modifier ma requête pour obtenir le résultat dont j'ai besoin s'il vous plaît ?

Merci !

4voto

trapper Points 3714

Un LEFT JOIN ou LEFT OUTER JOIN inclura toutes les lignes de la table initiale, y compris celles où il n'y a pas de correspondance dans la table jointe

SELECT u.username, COUNT(o.id), MAX(o.date)
FROM users u
LEFT OUTER JOIN orders o ON u.id = o.iduser AND o.status = 1
GROUP BY u.id

2voto

Widor Points 7307

Vous devez utiliser un OUTER JOIN au lieu de votre INNER JOIN actuel.

Consultez le post de Jeff ici pour voir en quoi ils sont différents : http://www.codinghorror.com/blog/2007/10/a-visual-explanation-of-sql-joins.html

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X