我有这些表:
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。
感谢您的帮助。
最佳答案
将条件移至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
子句中有条件。这在连接之后应用(将其视为在连接顶部进行过滤)。如果一行不符合此条件,它将被淘汰。 user_fans
表中没有条目的外部连接行将不满足此条件(值为 NULL)。
在 on
中设置条件将仅将 users 表连接到 user_fans
表的子集 - 在此过滤之后发生外连接。
关于mysql - 如何在一定时间范围内从其他表中选择具有 COUNT 行的表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10602278/