2016-05-15 2 views
0

Je n'ai besoin d'afficher que les données d'utilisateur de la dernière connexion, les données étant: nom, adresse électronique, emplacement et date/heure.Dernière heure de connexion à partir de la base de données SQL Server 2008

Scénario est l'utilisateur s'auto-enregistre pour la première fois et la date de connexion est insérée dans la table eventonline.participant ... maintenant pour la connexion suivante du même utilisateur seulement, nous enregistrons logintime dans eventonline.logindatetime. Ci-dessous est la requête que j'ai utilisée, mais elle sélectionne toutes les données de connexion des utilisateurs au lieu de la dernière date de connexion.

select 
    a.firstname as Name, 
    a.Email as Email, 
    a.Address1 as Location, 
    a.MobileNo as Contact, 
    a.datetime, a.ID 
from 
    eventonline.participant a 
where 
    a.eventid = '" + Convert.ToString(ConfigurationManager.AppSettings["event_id"]) + "' 

union 

select 
    a.firstname as Name, 
    a.Email as Email, 
    a.Address1 as Location, 
    a.MobileNo as Contact, 
    b.datetime, b.Rid 
from 
    eventonline.participant a 
join 
    eventonline.logindatetime b on a.Id = b.Rid 
where 
    b.eventid = '" + Convert.ToString(ConfigurationManager.AppSettings["event_id"]) + "' 
order by 
    datetime desc 

Répondre

0

Votre Database: eventonline , noms de tables: participants, logindatetime

Disons que votre table des participants contient les données suivantes: -

ID_enregistrement | user_phone | user_email | prénom | last_name | created_timestamp

1 | 5545555454 | [email protected] | tom | dave | 2016-03-05 21:33:55

2 | 5599992154 | [email protected] | riya | bas | 2016-03-05 15:33:55

3 | 5545876954 | [email protected] | greg | George | 2016-03-09 12:32:55

Et logindatetime table ont données suivantes: -

id | registration_id | ip_address | user_Agent | created_timestamp

1 | 2 | 10.2.3.101 | mozilla | 2016-03-05 15:54:11

2 | 3 | 10.0.5.99 | chrome | 2016-03-15 23:31:01

3 | 1 | 10.0.4.43 | safari | 2016-04-01 21:33:55

4 | 2 | 10.2.4.65 | mozilla | 2016-04-05 19:21:55

5 | 1 | 10.6.5.54 | chrome | 2016-04-11 19:12:15

Maintenant, si vous voulez récupérer les données de l'utilisateur avec les données de connexion correspondant à la 5ème ligne, c'est-à-dire la dernière ligne du temps de logindatetime, la requête ci-dessous fonctionnera.

select a.registration_id, a.user_phone, a.user_email, a.first_name, a.last_name, b.ip_address, b.user_Agent, b.created_timestamp du participant en tant que REJOIGNEZ logindatetime comme b = où a.registration_id b.enregistrement_id par b.created_timestamp desc limite 1;

Résultat

ID_enregistrement | user_phone | user_email | prénom | nom_fonction ip_address | user_Agent | created_timestamp

1 | 5545555454 | [email protected] | tom | dave | 10.6.5.54 | chrome | 2016-04-11 19:12:15

+0

'limite 1' avec' SQL Server 2008'? – lad2025

+0

D'accord, si son serveur SQL, puis l'utilisateur SELECT TOP 1 au début de la requête et supprimer 1 partie limite de la requête ci-dessus. – TECH007

+0

'de participant en tant que JOINindatetime comme b où a.registration_id = b.registration_id' JOIN nécessite" ON "pas" WHERE " – lad2025

0

Voici comment je vais écrire la requête pour le faire. J'ai utilisé la fonction rank over dans sql pour saisir uniquement les dernières ou les premières valeurs dans une partition de données que je veux regarder.

SELECT 
* 
FROM 
(
    select 
     -- Here is the magic that makes it work. 
     Rank() over (Partition BY a.Email order by a.datetime DESC) as Rank 
     a.firstname as Name, 
     a.Email as Email, 
     a.Address1 as Location, 
     a.MobileNo as Contact, 
     a.datetime, 
     a.ID 
    FROM 
    <YourFromCause> 
) 
-- naming the temp result set. 
tmp 
where 
    Rank = 1