如何在一段时间内从其他表中使用COUNT选择表上的行?

时间:2012-05-15 13:54:32

标签: 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。

感谢您的帮助。

2 个答案:

答案 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