我有这些表格:
users
-----
id INT
name VARCHAR(20)
email VARCHAR(40)
user_fans
----------
id INT
user_id INT /* linked to users.id */
fan_id INT /* linked to users.id */
time_created INT /* unix timestamp */
我可以使用以下查询从表users
获取名为num_fans
的其他字段的所有行
SELECT u.id, u.name, u.email, COUNT(f.id) AS num_fans
FROM users u
LEFT JOIN user_fans f ON u.id=f.user_id
GROUP BY u.id, u.name, u.email
ORDER BY num_fans DESC
问题是我需要在一段时间内获得num_fans
。我试过这个查询
SELECT u.id, u.name, u.email, COUNT(f.id) AS num_fans
FROM users u
LEFT JOIN user_fans f ON u.id=f.user_id
WHERE f.time_created > UNIX_TIMESTAMP('2012-5-1 00:00:00')
GROUP BY u.id, u.name, u.email
ORDER BY num_fans DESC
但上面的查询只会返回已有粉丝的用户。我希望其他用户也返回num_fans = 0。
感谢您的帮助。
答案 0 :(得分:2)
将条件移至on
:
SELECT u.id,
u.name,
u.email,
COUNT(f.id) AS num_fans
FROM users u LEFT JOIN user_fans f
ON u.id=f.user_id
and f.time_created > UNIX_TIMESTAMP('2012-5-1 00:00:00')
GROUP BY u.id, u.name, u.email ORDER BY num_fans DESC
的更新强>
(添加了关于@Gardon Dave建议的解释)
你所拥有和之间的区别是:
在您的查询中,您具有WHERE
子句中的条件。这是在Join之后应用的(在连接顶部看到此过滤)。如果一行不符合这个条件,它将被删除。在user_fans
表中没有条目的外连接行将不满足此条件(值将为NULL)。
拥有on
中的条件只会将users表加入user_fans
表的子集 - 在此过滤后会发生外连接。
答案 1 :(得分:0)
尝试在条件中添加null:
SELECT u.id, u.name, u.email, COUNT(f.id) AS num_fans
FROM users u
LEFT OUTER JOIN user_fans f ON u.id=f.user_id
WHERE f.time_created is null or f.time_created > UNIX_TIMESTAMP('2012-5-1 00:00:00')
GROUP BY u.id, u.name, u.email
ORDER BY num_fans DESC