如何使用自联接或其他方法选择最新数据?

时间:2012-02-28 05:29:18

标签: mysql sql

这是我的表结构:

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 个答案:

答案 0 :(得分:3)

你几乎就在那里,但要获得最新的每位用户,你必须在你的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的{​​{1}}小于dateupdated s。由于这是一个u2,如果LEFT JOIN对于同一个u.dateupdated没有更大的u2.updated,那么{{1}设置为NULL。

但是这些username 正好该用户的最大u2.updated,因此我们添加了u.dateupdated条件来抓取这些行。