2016-05-15 2 views
0

Мне нужно отображать только данные пользователя, данные последнего пользователя, данные - имя, адрес электронной почты, местоположение и дату и время.Получить последнее время входа в систему из базы данных SQL Server 2008

Сценарий - это пользователь, который регистрирует его сам в первый раз, и имя пользователя datetime вставляется в таблицу eventonline.participant ... теперь для последующего входа одного и того же пользователя мы сохраняем logintime в eventonline.logindatetime.

Ниже приведен запрос, который я использовал, но он выбирает все данные для входа в систему, а не последний день входа в систему.

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 

ответ

0

Ваш База данных: eventonline , Имена таблиц: участник, logindatetime

Пусть говорят, ваша таблица участников содержит следующие данные: -

registration_id | user_phone | user_email | first_name | last_name | created_timestamp

1 | 5545555454 | [email protected] | Том | Дэйв | 2016-03-05 21:33:55

2 | 5599992154 | [email protected] | riya | снизу | 2016-03-05 15:33:55

3 | 5545876954 | [email protected] | greg | джордж | 2016-03-09 12:32:55

И logindatetime таблице имеют следующие данные: -

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 | хром | 2016-03-15 23:31:01

3 | 1 | 10.0.4.43 | сафари | 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 | хром | 2016-04-11 19:12:15

Теперь, если вы хотите получить данные пользователя вместе с данными входа, соответствующими 5-й строке, то есть последней строке в logindatetime, тогда ниже запрос будет работать.

выберите a.registration_id, a.user_phone, a.user_email, a.first_name, a.last_name, b.ip_address, b.user_Agent, b.created_timestamp от участника в качестве соединения, как logindatetime б, где a.registration_id = b.registration_id order by b.created_timestamp desc limit 1;

Результат

registration_id | user_phone | user_email | first_name | last_name ip_address | user_Agent | created_timestamp

1 | 5545555454 | [email protected] | Том | Дэйв | 10.6.5.54 | хром | 2016-04-11 19:12:15

+0

'limit 1' с' SQL Server 2008'? – lad2025

+0

Хорошо, если его SQL-сервер затем пользователь SELECT TOP 1 в начале запроса и удалить ограничение 1 часть из запроса. – TECH007

+0

'от участника как JOIN logindatetime как b, где a.registration_id = b.registration_id' ПРИСОЕДИНЯЙТЕСЬ' ON', а не 'WHERE' – lad2025

0

Вот как я хотел бы написать запрос, чтобы сделать это. Я использовал функцию rank over в sql, чтобы захватить только последние или первые значения в разделе данных, на которые я хочу посмотреть.

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 
Смежные вопросы