1

这是我关于 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

4 回答 4

2

不要尝试进行子查询,只需按用户 ID 进行连接和分组。此外,您需要 YEARWEEK,以便匹配年份和星期,而不仅仅是任何一年的星期。

select userid, count(*)
    from users inner join signin on userid=suserid and yearweek(`date`) = yearweek(curdate())
    group by userid;

如果您希望尚未登录的用户的结果为 0,则左连接而不是内部连接。这遵循我假设您的“上周”意图,即当前日期的一周(默认情况下从星期日开始,但请参阅yearweek 的可选模式参数)。

请注意,这里的 users 表是完全可选的;你可以这样做:

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

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

于 2013-01-06T22:09:08.847 回答
0

s这应该是:

select suserid, count(suserid)
    from signin
    where date > NOW() - INTERVAL 1 WEEK
    group by suserid;
于 2013-01-06T22:02:33.300 回答
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

于 2013-01-06T22:05:45.800 回答
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;
于 2013-01-06T22:06:57.390 回答