如何使用自连接或其他方法选择最新的数据?
问题描述:
这里是我的表结构:如何使用自连接或其他方法选择最新的数据?
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;
...但它似乎错了,因为它“也”打印出来,昨天日的数据,因此如何要做到这一点,才能获得每个用户的确切最新数据,并避免打印出过去的数据?
答
就快,但要获得每个用户的最新的,你必须在你的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
使得存在没有为同一username
更大u2.updated
,那么u2.updated
设置为NULL。
但这些u.dateupdated
是正是最大dateupdated
该用户,因此我们在添加WHERE
条件抓住这些行。