2015-03-18 4 views
0

Я пытаюсь получить инструкцию SQL для работы, которая покажет список пользователей в базе данных и их последнее действие.SQL-запрос для последнего действия пользователя

Текущий формат таблицы;

tblUser:
идентификатор, имя пользователя, пароль

tblAction:
ID, UID, действие, дата

SQL-Постулаты у меня есть на данный момент является;

SELECT * 
FROM tblUser 
FULL OUTER JOIN Location 
ON tblUser.id=tblAction.uid 
WHERE action IS NOT NULL 
ORDER BY date DESC 

Я использовал limit 1, но это не сработало.

Я также пробовал;

SELECT *  
FROM tblAction T1  
WHERE date = (
    SELECT max(date) 
    FROM tblUser T2 
    WHERE T2.uid=T1.id 

Пожалуйста, кто-нибудь может мне помочь? Это команда SQL, которая должна быть выполнена на панели администратора в PHP и не является MySQL.

+0

Используйте '1' TOP вместо – Lamak

+0

, когда я использовал' топ 1 ' похоже, что он возвращает последнее действие, а не последнее из пользователей – jjharvey

+0

. Я дал ответ, который должен дать вам то, что вы хотите – Lamak

ответ

1

ROW_NUMBER Использование:

;WITH CTE AS 
(
    SELECT U.*, 
      A.[action], 
      A.[date], 
      RN = ROW_NUMBER() OVER(PARTITION BY U.id ORDER BY A.[date] DESC) 
    FROM tblUser U 
    LEFT JOIN tblAction A 
     ON U.id = A.uid 
) 
SELECT * 
FROM CTE 
WHERE RN = 1; 
+0

Я вижу, что это хорошо работает с http://sqlfiddle.com/#!6/c50f71/2 Я просто пытаюсь заставить его работать на веб-сайте, как я получаю ошибка «Предупреждение: sqlsrv_fetch_array() ожидает, что параметр 1 будет ресурсом, boolean задан« – jjharvey

+0

@jjharvey, это похоже на другой вопрос – Lamak

1

использование попытка RANK()/DENSE_RANK()/ROW_NUMBER()

FIDDLE DEMO

RANK:

;WITH CTE AS 
(
    SELECT a.*, 
      b.action, 
      b.date, 
      Rk = RANK() OVER(PARTITION BY a.id ORDER BY b.[date] DESC) 
    FROM tblUser a 
    LEFT JOIN tblAction b 
     ON a.id = b.uid 
) 
SELECT * 
FROM CTE 
WHERE Rk = 1; 
+0

Когда я использовал это, он отображает только последнее действие, а не последнее действие пользователя. , например. TOM - Вход Failure - 18/03/15 вместо TOM - Вход Failure - 18/03/15 DAVE - Запрос Зарегистрирован - 18/03/15 – jjharvey

+0

ждать, обновление. –

+0

смотреть сейчас. @jjharvey –