这是我的表结构:
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;
...但它似乎有误,因为它“也”打印出昨天的数据,那么如何才能获得仅针对每个用户的确切最新数据并避免打印出过去的数据?
答案 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
条件来抓取这些行。