Как выбрать последние данные, используя самостоятельное соединение или другой метод? - PullRequest
1 голос
/ 28 февраля 2012

Вот моя структура таблицы:

CREATE TABLE USER ( 
  id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
  username VARCHAR(50),
  `status` VARCHAR(50),
  `dateupdated` DATETIME
) ENGINE = INNODB;  

Если данные имеют ID в качестве первичного ключа, то имя пользователя может быть повторено, скажем, у меня есть 3 пользователя, и у всех них былоОбновление статуса вчера и сегодня.Теперь мой вопрос: как выбрать только последние обновления статуса от каждого пользователя? Вот мое решение

   SELECT user.`username`, latest.status AS latest_status , user.`dateupdated` 
     FROM USER 
LEFT JOIN USER AS latest ON user.`id` = latest.id 
 ORDER BY dateupdated DESC;

... но оно кажется неправильным, потому что оно "также" распечатало данные, датированные вчера,как это сделать, чтобы получить точные последние данные только для каждого пользователя и избежать распечатки прошлых данных?

1 Ответ

3 голосов
/ 28 февраля 2012

Вы почти у цели, но чтобы получить последние данные для каждого пользователя, вам нужно добавить дополнительное условие сортировки в JOIN и условие where:

SELECT  u.username, u.status AS latest_status , u.dateupdated 
FROM USER u
LEFT JOIN USER u2
 ON u.username=u2.username 
AND u.dateupdated < u2.dateupdated  -- see extra JOIN cond?
WHERE u2.dateupdated IS NULL        -- see extra WHERE cond?
ORDER BY dateupdated DESC;

Для этого нужно присоединиться USERсам по себе не только внутри имени пользователя, но и так, что u 'dateupdated меньше, чем u2 с.Так как это LEFT JOIN, если существует u.dateupdated такой, что не больше u2.updated для того же username, то u2.updated устанавливается в NULL.

Но эти u.dateupdated являются точно максимальным dateupdated для этого пользователя, и поэтому мы добавляем условие WHERE для захвата этих строк.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...