这是我在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
子查询并使其计算每个人的登录(日期列),并返回每个人的个性化数字。我知道查询完全被抬起但我只是在那一点,你知道,我已经变得如此困惑,我只需要一些指导。
任何帮助和方向都会很棒!我读了这么多页无济于事。提前谢谢!
**并感谢您的编辑。当我再次发帖时,他们将来会有所帮助。
答案 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;