2010-12-14 87 views
0

J'ai 2 tables dans ma base de données. Un suivi lorsque les utilisateurs se connectent: ID, nom, IP, & horodatage. L'autre est une série d'événements: id, nom de l'événement, IP, & horodatage.Connectez-vous à l'utilisateur à partir de l'horodatage

Existe-t-il un moyen facile de voir quel utilisateur est connecté pour un événement spécifique?

Par exemple, si je

id l_ip   l_user l_time 
0 172.16.1.10 ces77 2010-12-14 09:02:12 
1 172.16.1.64 ces34 2010-12-14 10:06:43 
2 172.16.1.10 ces47 2010-12-14 11:10:52 

et

id e_name e_ip   e_time 
0 remove 172.16.1.10 2010-12-14 09:10:33 
1 run  172.16.1.64 2010-12-14 10:15:10 
2 change 172.16.1.64 2010-12-14 10:20:32 
3 run  172.16.1.10 2010-12-14 12:55:59 

pourrais-je exécuter une requête pour me donner à l'utilisateur pour chacun des événements de sorte qu'il produirait?

id e_name e_ip   e_time    l_user 
0 remove 172.16.1.10 2010-12-14 09:10:33 ces77 
1 run  172.16.1.64 2010-12-14 10:15:10 ces34 
2 change 172.16.1.64 2010-12-14 10:20:32 ces34 
3 run  172.16.1.10 2010-12-14 12:55:59 ces47 

Répondre

1

La meilleure façon de gérer cela est de code qui accède à la base de données. Il ne sera probablement pas très rapide, car les données nécessaires pour répondre efficacement à la question ne sont pas disponibles; vous devrez regarder les enregistrements, puis pour chaque enregistrement répondre à la question "quel utilisateur a été connecté en ce moment?".

Une suggestion pourrait être d'effectuer un de -normalisation sur votre schéma, et permettre à l'information de l'utilisateur d'apparaître dans deux tables. Si vous utilisez des noms d'utilisateur comme clé dans votre table utilisateur, vous pouvez simplement faire de la colonne l_user un FK pointant vers cette table. Bien sûr, vous aurez toujours besoin d'un programme écrit pour mettre à jour les tables afin d'inclure les données que vous recherchez en premier lieu, et il n'y a aucun moyen de les corriger à 100% pour tous les horodatages, sauf si vous le pouvez garantir certaines choses comme "l'utilisateur ne s'est pas déconnecté entre les horodateurs A et B" et ainsi de suite. J'écrirais d'abord un programme pour obtenir les réponses à la question à laquelle vous voulez répondre maintenant, puis j'essaierais sérieusement d'apporter quelques améliorations à la structure de données pour que vous puissiez toujours répondre à cette question avec rien de plus qu'une seule requête SQL. Essentiellement, parcourez chaque événement, trouvez qui a été connecté quand cet événement s'est produit et écrivez-le quelque part (à moins que vous ne puissiez vous permettre de conserver cette information en mémoire pour pouvoir l'utiliser plus tard, bien sûr).

+0

Au début, je pensais que l'autre solution fonctionnait, mais plus tard réalisé que non. Cela renverra tout utilisateur connecté auparavant. Je pense que Michael a raison ... mais cela signifie que je dois redessiner certaines parties du programme: ( – Nathan

+0

En supposant qu'un utilisateur est toujours connecté lorsqu'un événement se produit, voir ma réponse qui correspond à votre jeu de données – Danosaure

+0

@Danosaure: Un intéressant Pour ce faire, il vaut mieux payer le coût de l'agrégation et de la validation des données dès le départ, et passer à un modèle où toutes les informations appropriées sont enregistrées, sauf s'il y a vraiment une bonne raison de faire autrement. , il me semble logique de garder le coût de lecture des données bas: il y a déjà assez de tâches de traitement de données qui prennent du temps sans traitement supplémentaire inutile pour répondre à des questions comme celle-ci ... –

1

UPD>

SELECT e.id, e_name, e_ip, e_time, l_user 
FROM events e 
    INNER JOIN loggedin l ON e.e_ip = l.l_ip AND e.e_time >= l.l_time 

Est-ce que vous avez besoin?

+0

Pas exactement. Le problème est que les événements ne correspondent pas à l'heure exacte à laquelle quelqu'un se connecte. J'ai besoin de voir l'utilisateur qui s'est connecté avant l'horodatage de l'événement. Merci pour la réponse. – Nathan

+0

Voir mise à jour, ici sélectionne uniquement les événements qui se sont produits après la connexion. – rMX

+0

C'est presque parfait; Je viens de l'ajuster un peu. Merci beaucoup - vous m'avez sauvé des heures de travail! – Nathan