我有一个在MySQL中有两个表的场景。
表1:用户

表2: login_history

我试图想出一个查询,让那些在特定时间内没有登录的用户,比如2017-09-25和2017-10-2之间的用户。
我试着使用子查询,但是这个查询非常慢。在这个例子中,我给出了虚拟数据,但实际上有两个表--特别是login_history --有大量的数据,因此子查询需要时间。
发布于 2017-10-02 11:35:10
会是这样的:
select u.*
from users u
where not exists (select 1
from logins l
where l.user_id = u.id and
l.login_at >= '2017-09-25' and
l.login_at <= '2017-10-02'
);如果这很慢,那么尝试在logins(user_id, login_at)上创建一个索引。
假设您只希望在某个时候登录的用户,您可以尝试聚合:
select l.user_id
from logins l
group by l.user_id
having sum(l.login_at >= '2017-09-25' and l.login_at <= '2017-10-02') = 0;然而,not exists应该更快。
发布于 2017-10-02 11:38:12
你就不能用一个基本的查询吗?
SELECT * FROM USERS U
JOIN login_history L
ON U.id = L.user_id
WHERE login_at NOT BETWEEN '2017-09-25' AND '2017-10-2'https://stackoverflow.com/questions/46524616
复制相似问题