MySQL COUNT过滤

时间:2013-01-06 21:55:18

标签: mysql join count

这是我在stackoverflow上的第一篇文章,虽然我已经将它作为参考使用了很长时间。非常感谢您过去为我提供的所有指导。对此,我真的非常感激。这是我的问题:

我有两个表,一个名为USERS,另一个名为SIGNIN

USERS  
-----------------
userid | password

SIGNIN
--------------
suserid | date

我想计算用户在上周期间登录的次数。

这就是我所拥有的:

SELECT userid, password FROM USERS JOIN (SELECT suserid, COUNT(*) AS logins 
FROM signin 
WHERE WEEKOFYEAR(date) = WEEKOFYEAR(CURDATE()) && signin.suserid = users.userid) 
GROUP BY userid

我无法理解如何JOIN子查询并使其计算每个人的登录(日期列),并返回每个人的个性化数字。我知道查询完全被抬起但我只是在那一点,你知道,我已经变得如此困惑,我只需要一些指导。

任何帮助和方向都会很棒!我读了这么多页无济于事。提前谢谢!

**并感谢您的编辑。当我再次发帖时,他们将来会有所帮助。

4 个答案:

答案 0 :(得分:2)

不要尝试执行子查询,只需按用户ID进行连接和分组。此外,你想要YEARWEEK所以你匹配年和周,而不仅仅是任何一年的一周。

select userid, count(*)
    from users inner join signin on userid=suserid and yearweek(`date`) = yearweek(curdate())
    group by userid;
如果您希望未登录的用户的结果为0,请

左连接而不是内连接。 这遵循我假设的“上周”的意图,意味着当前日期的一周(默认情况下从星期日开始,但请参阅年周的可选模式参数)。

请注意,此处的users表是完全可选的;你可以这么做:

select suserid, count(*) from signin
    where yearweek(`date`) = yearweek(curdate())
    group by suserid;

但我猜你可能会从用户那里获得其他列,或者想要为已删除的用户排除signins。

答案 1 :(得分:0)

s应该是这样的:

select suserid, count(suserid)
    from signin
    where date > NOW() - INTERVAL 1 WEEK
    group by suserid;

答案 2 :(得分:0)

如果我理解正确,您不需要子查询。

类似的东西:

SELECT a.userid, a.password, count(b.date) AS logins
FROM users a
INNER JOIN signin b ON a.userid = b.suserid  and WEEKOFYEAR(date) = WEEKOFYEAR(CURDATE())
GROUP BY a.userid, a.password

抱歉 - 没有时间尝试查询来仔细检查语法,但希望能让你朝着正确的方向前进

编辑:如果要包含0登录的用户,请更改为LEFT OUTER JOIN

答案 3 :(得分:0)

你不需要在这里加入。你需要的是

SELECT userid, password, (SELECT COUNT(*) 
FROM SIGNIN
WHERE WEEKOFYEAR(date) = WEEKOFYEAR(CURDATE()) AND signin.suserid = users.userid) AS logins
FROM USERS WHERE 1 GROUP BY userid;