mysql - 如何在一定时间范围内从其他表中选择具有 COUNT 行的表?

标签 mysql sql

我有这些表:

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/

相关文章:

php - Mysql Select 从现在到 future 7​​天的记录

php - AngularJS | Codeigniter中如何将Json数据发送到数据库

php - 从以 json 编码格式存储的数据库中检索值 - Mysql

sql - sql where语句中的r列值

MySQL帮助正向工程

php - 何时检查查询是否成功完成

mysql - 无限级数如何计算等级?

mysql - 过滤 IN 语句

mysql - 规范化联结表中的列

sql - 当确定它们存在于一个表中时,如何从两个表而不是一个表中获取行