2012-02-28 57 views
1

这里是我的表结构:如何使用自连接或其他方法选择最新的数据?

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; 

...但它似乎错了,因为它“也”打印出来,昨天日的数据,因此如何要做到这一点,才能获得每个用户的确切最新数据,并避免打印出过去的数据?

回答

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本身不仅在用户名,但使得udateupdated小于u2秒。由于这是一个LEFT JOIN,如果有一个u.dateupdated使得存在没有为同一username更大u2.updated,那么u2.updated设置为NULL。

但这些u.dateupdated正是最大dateupdated该用户,因此我们在添加WHERE条件抓住这些行。

相关问题