2012-04-25 2 views
1

У меня есть две таблицы:MySql Выберите последняя запись для каждого пользователя

users: 
user_id user_name 

data: 
user_id user_data user_time 

я тусклый, чтобы выбрать самую последнюю запись из таблицы данных, но вернуть user_name, user_id, user_data и user_time.

Я попытался следующий запрос, но он возвращает первый записи, не последнюю для каждого пользователя:

sql = "SELECT users.user_name, users.user_id, data.user_data, data.user_time 
FROM users 
INNER JOIN data ON data.user_id = users.user_id 
GROUP BY users.user_name 
ORDER BY data.user_time DESC"; 
+0

если убывание дает вам неправильный конец, то asc, вероятно, ответ –

+0

Что такое тип столбца и формат data.user_time? – trickyzter

+0

Пожалуйста ... ребята ... прочитайте вопрос. Я хочу самую последнюю запись для каждого пользователя. Запрос возвращает запись FIRST. Я хочу, чтобы возвращаемые результаты отсортировались по DESC так, как сейчас. Мне просто нужны последние записи. –

ответ

8

Использование GROUP BY и MAX, ГДЕ ... В:

SELECT u.user_id, u.user_name, d.user_data, d.user_time 
FROM users u 
    INNER JOIN data d ON d.user_id = u.user_id 
WHERE (d.user_id, d.user_time) = 
    (SELECT user_id, MAX(user_time) FROM data GROUP BY user_id) 

Я думаю, вам лучше добавить столбец data_id в таблицу данных. Если data_id, как user_id и user_time не нужны для PRIMARY KEY (и user_time не всегда уникальны, не надежен)

Если есть data_id, это может быть Bitly просто:

SELECT u.user_id, u.user_name, d.user_data, d.user_time 
FROM users u 
    INNER JOIN data d ON d.data_id = 
    (SELECT data_id FROM data 
     WHERE user_id = u.user_id ORDER BY data_time DESC LIMIT 1) 
+0

Ницца! Подзапрос предоставляет последние данные, WHERE выбирает его, остальная часть запроса извлекает данные. Мне это нравится! – Malovich

+0

спасибо Маловичу, но уже слишком поздно; ==) Я просто редактирую свой код и показываю другое лучшее решение – tosin

+0

@tosin: почему вы говорите, что составной первичный ключ не является надежным? –

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