2011-10-20 94 views
13

這是表結構如何用MAX進行選擇(日期)?

CREATE TABLE `reports` (
    `report_id` int(11) NOT NULL auto_increment, 
    `computer_id` int(11) NOT NULL default '0', 
    `date_entered` datetime NOT NULL default '1970-01-01 00:00:00', 
    `total_seconds` int(11) NOT NULL default '0', 
    `iphone_id` int(11) default '0', 
    PRIMARY KEY (`report_id`), 
    KEY `computer_id` (`computer_id`), 
    KEY `iphone_id` (`iphone_id`) 
) ENGINE=MyISAM AUTO_INCREMENT=120990 DEFAULT CHARSET=latin1 

我需要一個SELECT聲明將列出report_idcomputer_id從最新進入date_entered,我不知道該怎麼做。任何人都可以將我指向正確的方向嗎? Thx提前。

回答

28

這應做到:

SELECT report_id, computer_id, date_entered 
FROM reports AS a 
WHERE date_entered = (
    SELECT MAX(date_entered) 
    FROM reports AS b 
    WHERE a.report_id = b.report_id 
     AND a.computer_id = b.computer_id 
) 
+2

差不多。我遺漏了「a.report_id = b.report_id」,這就是訣竅。謝謝 – poetter747

+2

這是有點低效的,因爲你生成了太多的子查詢。 而是嘗試使用不相關的子查詢。 https://dev.mysql.com/doc/refman/5.6/en/example-maximum-column-group-row.html – Pablo

+0

Pablo是正確的。過濾可以通過加入子查詢來完成,從而可以節省性能。 – twicejr

11

您只希望它顯示最後一個date_entered,或者要從輸入的last_date開始進行排序?

SELECT report_id, computer_id, date_entered 
FROM reports 
GROUP BY computer_id 
ORDER BY date_entered DESC 
-- LIMIT 1 -- uncomment to only show the last date. 
+2

當ID做到這一點,我得到錯誤REPORT_ID。我用WHERE computer_id = 30檢查了語句。結果是所有找到的report_id的第一個report_id與最近的date_entered – poetter747

3

Accordig這樣:https://bugs.mysql.com/bug.php?id=54784鑄造爲char應該做的伎倆:

SELECT report_id, computer_id, MAX(CAST(date_entered AS CHAR)) 
FROM reports 
GROUP BY report_id, computer_id 
+0

這會讓你獲得最大日期,但不一定是來自同一行的其他值。 – Vincent

0
SELECT report_id, computer_id, date_entered 
FROM reports 
WHERE date_entered = (
    SELECT date_entered 
    FROM reports 
    ORDER date_entered 
    DESC LIMIT 1 
) 
+1

感謝您使用此代碼段,這可能會提供一些有限的即時幫助。通過展示*爲什麼*這是一個很好的解決方案,並且使它對未來的讀者更有用,一個正確的解釋[將大大提高](// meta.stackexchange.com/q/114762)其長期價值其他類似的問題。請[編輯]你的答案以添加一些解釋,包括你所做的假設。 –

相關問題