即使另一个表中没有记录,也可以获取所有用户

时间:2012-05-28 16:04:19

标签: mysql join

我在这里面临一个问题:

我有两张桌子:

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未显示,因为他没有订购。如何修改我的请求以获得我需要的结果?

谢谢!

2 个答案:

答案 0 :(得分:4)

LEFT JOINLEFT OUTER JOIN将包含初始表的所有行,包括那些在连接表中没有匹配的行

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

答案 1 :(得分:2)

您需要使用OUTER JOIN代替当前的INNER JOIN

在这里查看Jeff的帖子,了解它们的不同之处: http://www.codinghorror.com/blog/2007/10/a-visual-explanation-of-sql-joins.html