2011-10-20 68 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)其长期价值其他类似的问题。请[编辑]你的答案以添加一些解释,包括你所做的假设。 –

相关问题