3 votes

SQL : Obtenir les utilisateurs non connectés dans une plage de dates donnée

J'ai un scénario avec deux tables dans MySQL.

Tableau 1 : Utilisateurs

enter image description here

Tableau 2 : login_history

enter image description here

J'essaie de trouver une requête pour obtenir les utilisateurs qui n'ont pas été connectés, dans une période donnée, par exemple entre 2017-09-25 ET 2017-10-2.

J'ai essayé d'utiliser la sous-requête, mais cette requête est assez lente. Dans l'exemple, j'ai donné des données fictives, mais en fait, deux tables, en particulier login_history, contiennent une quantité énorme de données, ce qui fait que la sous-requête prend du temps.

1voto

Gordon Linoff Points 213350

Ce serait quelque chose comme ça :

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'
                 );

Si cela est lent, essayez alors de créer un index sur logins(user_id, login_at) .

En supposant que vous ne voulez que les utilisateurs qui se sont connectés à un moment donné, vous pouvez essayer l'agrégation :

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;

Toutefois, le not exists devrait être plus rapide.

1voto

Ryan Gadsdon Points 1195

Ne pouvez-vous pas simplement utiliser une requête de base ?

 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'

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X