Obțineți toți utilizatorii chiar dacă nu există înregistrări în alt tabel

Mă confrunt cu o problemă aici:

Am două mese:

Un tabel users :

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

Un tabel 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      |
±----±---------------±----------±--------+

Ceea ce încerc să fac este să obțin un rezultat ca acesta:

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

Iată solicitarea pe care o am pentru moment:

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

Această solicitare îmi dă un rezultat ca:

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

După cum puteți vedea, utilizatorul Casimir nu este afișat deoarece nu a făcut nici o comandă. Cum îmi pot modifica solicitarea de a obține rezultatul de care am nevoie?

Mulțumiri !

0
Utilizați OUTER JOIN ...
adăugat autor Fahim Parkar, sursa

2 răspunsuri

Un LEFT JOIN sau LEFT OUTOUN JOIN va include toate rândurile tabelului inital, inclusiv cele în care nu există nici o potrivire în tabelul îmbinat

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
0
adăugat
Ok, o să încerc asta, o să vă spun despre rezultat. Mulțumiri
adăugat autor Billy McNuggets, sursa
Lucrează mai bine! Mulțumesc !
adăugat autor Billy McNuggets, sursa

Trebuie să utilizați un OUTOUN JOIN în loc de codul dvs. curent INNER JOIN .

Have a look at Jeff's post here to see how they differ: http://www.codinghorror.com/blog/2007/10/a-visual-explanation-of-sql-joins.html

0
adăugat
MySQL - comunitatea Română
MySQL - comunitatea Română
19 participanți

Comunitatea română a programatorilor MySQL.