mysql - SQL如何选择本周内其id在右表中出现次数少于5次的左表?

标签 mysql sql join

下面是我的左表,用户

id    name 
1     a 
2     b
3     c 

下面是我的右表user_present

id    user_id    created_at 
1     1          2016-12-01 00:00:00
2     2          2016-12-01 01:00:00
3     2          2016-12-02 03:00:00 
4     1          2016-12-04 00:00:00
6     1          2016-12-05 00:00:00 
7     1          2016-12-06 00:00:00
8     1          2016-12-07 00:00:00 
9     1          2016-12-08 00:00:00 
10    2          2016-12-08 00:00:00 
11    2          2016-12-08 10:59:59
12    2          2016-12-09 10:59:59 

如何编写联接查询来获取以下用户作为结果,即本周出现次数少于 5 次的用户?假设当前日期是2016-12-09

id    name 
2     b
3     c    

用户a不会被包含在内,因为它在2016-12-042016-12-10之间在右表中出现了5次> 这是本周。我们只得到用户 bc,因为 b 在本周只出现了 3 次,前 2 次是在上周。那不算。我们也得到了 c,因为 c 尚未出现在右表中。

最佳答案

使用having子句和count与条件,试试这个:

select
   u.*
from `user` u
left join user_present up
on u.id = up.user_id
group by u.id, u.name
having count(
    case
        when week(up.created_at) = week('2016-12-09 00:00:00') then 1
        else null
    end
) < 5

参见demo在这里。

关于mysql - SQL如何选择本周内其id在右表中出现次数少于5次的左表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41056506/

相关文章:

使用黑洞引擎的Mysql主主复制

sql - Rails - has_one 与 WHERE 和 ORDER 的关系?

sql - 选择多行作为数组

mysql - 创建查询以按 2 个字段获取未完成调用组的计数

mysql - PG::UndefinedTable: 错误:关系 'caves' 不存在

mysql - 选择是否使用MySQL语句更新记录

c# - 我怎样才能加入一个字符串数组,但首先删除数组中的空元素?

mysql - 使用 MySQL : Update field with values using Inner Join

C# mysql 将大数据表上传到 mysql db 表的最佳方法

sql - 相关记录的条件计数