2012-02-28 62 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條件抓住這些行。

相關問題