2015-12-23 1 views
3

Я пробовал это целый день, но безуспешно. У меня есть 3 таблицы в моих системах, которые заключаются в следующем:SQL для возвращения активных пользователей, которые не вышли из системы

***User*** 
    UserID (PK) 
    Username 

    ***Usertransaction*** 
    UsertransactionID (PK) (auto_increment) 
    UserID (FK) 
    TransactionID (FK) 
    TimeStamp 

    ***Transaction*** 
    TransactionID (PK) 
    TransactioName 

Tables and Test Data - SQLFiddle

Когда пользователь входит в систему его нужно регистрироваться в таблице UserTransaction. Создана запись с UserID пользователя, идентификатором транзакции и временной меткой.

Это вход: $Query="insert into usertransaction('$UserID',1)" Временная метка автоматически создается СУБД при вводе записи. То же самое выполняется системой, когда пользователь выходит из системы, но с другим идентификатором транзакции.

Это Выход: $Query="insert into usertransaction('$UserID',2)"

Так esentially Логин и выход из системы записывается в той же базе данных. У пользователя может быть много логинов и много выходных данных, но я хочу самый последний раз. Я сражался с SQL-запросом, чтобы вернуть счет всех пользователей, которые вошли в систему, однако не вышли из системы. Я знаю его Рождество, но, пожалуйста, любезно помогите.

меня это до сих пор:

select A.useriD,A.transactionID,A.Timestamp 
from usertransaction 
INNER JOIN 
(
    select userID, max(Timestamp) AS Latest_Login 
    from usertransaction 
    WHERE usertransaction=1 
) AS B 
ON A.UserID=B.UserID,A.transactionID=B.transactionID,A.Timestamp=B.Latest_Login 
WHERE usertransaction=1 


select A.useriD,A.transactionID,A.Timestamp 
from usertransaction 
INNER JOIN 
(
    select userID, max(Timestamp) AS Latest_Logout 
    from usertransaction 
    WHERE usertransaction=2 
) AS B 
ON A.UserID=B.UserID,A.transactionID=B.transactionID,A.Timestamp=B.Latest_Logout 
WHERE usertransaction=2 

Я получаю результат для входа и выхода из системы результат отдельно. Как я могу сравнить два оператора и проверить, все ли пользователь вошел в систему?

+0

Привет Райан Я пытаюсь загрузить соответствующий документ слова, где Я документировал все. В нем есть экранные таблицы пользовательских таблиц. –

+0

Здесь ребята, вот скрипка [ссылка] http://sqlfiddle.com/#!9/8830f/1 –

+0

Я пытаюсь редактировать свой пост, но я не могу. Может ли это отредактировать и включить скрипку? –

ответ

1

@Kickstart является правильным, хотя запрос нуждается в модификации:

SELECT ut1.UserID 
    ut1.transactionID, 
    ut1.Timestamp 
FROM Usertransaction ut1 
LEFT OUTER JOIN Usertransaction ut2 
ON ut1.UserID = ut2.UserID 
AND ut2.TransactionID = 2 
AND ut1.TimeStamp < ut2.Timestamp 
WHERE ut1.TransactionID = 1 
AND ut2.UsertransactionID IS NULL 
+0

Оба кода работают, однако, если я вхожу в систему и выхожу из запроса, я все равно возвращаю. Я просто хочу видеть пользователей, которые вошли в систему и не вышли из системы –

+0

@ Запрос Kickstart всегда будет возвращать все, поскольку предикат LEFT JOIN находится на ut1.TransactionID, равном 1 И 2, поэтому всегда будет выводить NULL. Я не вижу, как мой запрос может вернуть вас, если вы вышли из системы. Можете ли вы опубликовать данные, которые были записаны в таблицу Usertransaction для входа/выхода из системы? – strickt01

+0

Вот скрипка http://sqlfiddle.com/#!9/8830f/1 –

1

Чтобы получить список пользователей, имеющие вошедшие в записи без последующей вошедшей из записи, присоединиться к таблице транзакций пользователей против себя с LEFT OUTER JOIN, а затем исключить записи, где бревно из столбцов нулевые

Что-то вроде этого: -

SELECT ut1.UserID, 
    ut1.transactionID, 
    ut1.Timestamp 
FROM Usertransaction ut1 
LEFT OUTER JOIN Usertransaction ut2 
ON ut1.UserID = ut2.UserID 
AND ut2.TransactionID = 6 
AND ut1.TimeStamp < ut2.Timestamp 
WHERE ut2.UsertransactionID IS NULL 
AND ut1.TransactionID = 1 
+0

См. Выше ответ –

+1

Ой, опечатка. 2-я проверка на TransactionID должна была ссылаться на ut2 – Kickstart

+0

Вот скрипка http://sqlfiddle.com/#!9/8830f/1 –

Смежные вопросы