2

我在这里遇到一个问题:

我有两张桌子:

一张users桌子:

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

一张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      |
±----±---------------±----------±--------+

我想要做的是得到这样的结果:

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

这是我目前的要求:

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

这个请求给了我这样的结果:

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

如您所见,用户Casimir没有显示,因为他没有下订单。请问如何修改我的请求以获得我需要的结果?

谢谢 !

4

2 回答 2

4

一个LEFT JOINorLEFT OUTER JOIN将包括初始表的所有行,包括那些在joined-to表中没有匹配的行

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
于 2012-05-28T16:05:46.457 回答
2

您需要使用 anOUTER JOIN而不是当前的INNER JOIN.

看看 Jeff 的帖子,看看它们有何不同: http: //www.codinghorror.com/blog/2007/10/a-visual-explanation-of-sql-joins.html

于 2012-05-28T16:06:37.797 回答