2014-07-22 114 views
0

我正在使用mysql作爲數據庫,我有一個如下所示的表。在MySQL中按順序排序

CREATE TABLE IF NOT EXISTS `logins` ( 
    `id` int(255) NOT NULL AUTO_INCREMENT, 
    `userid` varchar(255) NOT NULL, 
    `date` varchar(255) NOT NULL, 
    `status` varchar(255) NOT NULL, 
    KEY `id` (`id`) 
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=346 ; 

我想按order排序mysql結果。問題是當我使用這個sql它只需要第一個日期記錄。這是一個更舊的日期。我想要最新的日期。用戶的最後登錄日期。

SELECT * FROM `logins` WHERE `status`='valid' GROUP BY `userid` ORDER BY `date` DESC 

有什麼建議?

+2

您在SELECT中有GROUP BY但沒有AGGREGATE。 – Matt

+1

如上所述,在沒有任何聚合函數的情況下,使用GROUP BY是不合適的。如果你願意,可以考慮遵循以下簡單的兩步式操作:1.如果你還沒有這樣做(並且你沒有這樣做),提供適當的DDL(和/或一個sqlfiddle),這樣我們可以更容易地複製問題。 2.如果您尚未這樣做,請提供與步驟1中提供的信息相對應的所需結果集。 – Strawberry

+0

翻譯:刪除「GROUP BY用戶標識」 – Matt

回答

1

要做到這一點,你使用子查詢來獲取每個用戶ID的最新記錄,然後加入該到登錄表得到的細節

SELECT logins.* 
FROM logins 
INNER JOIN 
(
    SELECT userid, MAX(`date`) AS max_date 
    FROM `logins` 
    WHERE `status` = 'valid' 
    GROUP BY `userid` 
) sub0 
ON logins.userid = sub0.userid 
AND logins.`date` = sub0.max_date 
WHERE `status` = 'valid' 
+0

這個SQL工作。非常感謝你 – r10

0

你幾乎擁有了休息。假設id和userId不會從一次登錄發展到另一次登錄,詢問MAX日期應該會給你預期的結果。

SELECT id, userId, MAX(`date`) AS lastDate, 'valid' 
FROM `logins` 
WHERE `status`='valid' 
GROUP BY `userid` 
ORDER BY `lastDate` DESC 

請注意,如果表中登錄名之間有數據發生變化,您將需要JOIN。