0

我有这些表:

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。

谢谢你的帮助。

4

2 回答 2

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子句中有条件。这在加入之后应用,(将此视为加入顶部的过滤)。如果一行不符合这个条件,它将被淘汰。表中没有条目的外部连接行将user_fans不满足此条件(值将为 NULL)。

中的条件on将仅将用户表连接到表的子集user_fans- 外部连接发生在此过滤之后。

于 2012-05-15T13:58:11.357 回答
0

尝试将 is 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
于 2012-05-15T14:00:20.903 回答