我在这里面临一个问题:
我有两张桌子:
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
未显示,因为他没有订购。如何修改我的请求以获得我需要的结果?
谢谢!
答案 0 :(得分:4)
LEFT JOIN
或LEFT 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