2012-04-27 58 views
0

我有一个包含三个字段的ID,一个日期(字符串)和一个INT。喜欢这个。需要从两个字段中选择,第一个是基于最高的第二个

+--------------------------- 
+BH|2012-09-01|56789 
+BH|2011-09-01|56765 
+BH|2010-08-01|67866 
+CH|2012-09-01|58789 
+CH|2011-09-01|56795 
+CH|2010-08-01|67866 
+DH|2012-09-01|52789 
+DH|2011-09-01|56665 
+DH|2010-08-01|67866 

我需要基本上为每个ID,我只需要返回具有最高日期字符串的行。从这个例子中,我的结果将需要。

+--------------------------- 
+BH|2012-09-01|56789 
+CH|2012-09-01|58789 
+DH|2012-09-01|52789 
+0

_Why_的日期作为字符串存储?这是一个**可怕的想法(尽管至少它们在这里是一种可排序的形式)。你到目前为止尝试过什么?如果有重复的日期呢? – 2012-04-27 21:10:52

回答

0
SELECT id, date, int 
FROM ( SELECT id, date, int 
     FROM table_name 
     ORDER BY date DESC) AS h 
GROUP BY id 

替换表名和列,以正确的。

+0

我重读这篇文章,并准备做同样的事情,大声笑... GMTA – GDP 2012-04-27 21:09:11

1
SELECT t.id, t.date_column, t.int_column 
    FROM YourTable t 
     INNER JOIN (SELECT id, MAX(date_column) AS MaxDate 
         FROM YourTable 
         GROUP BY id) q 
      ON t.id = q.id 
       AND t.date_column = q.MaxDate 
0

假设如下结构:

CREATE TABLE `stackoverflow`.`table_10357817` (
    `Id` int(11) NOT NULL AUTO_INCREMENT, 
    `Date` datetime NOT NULL, 
    `Number` int(11) NOT NULL, 
    `Code` char(2) NOT NULL, 
    PRIMARY KEY (`Id`) USING BTREE 
) ENGINE=MyISAM AUTO_INCREMENT=11 DEFAULT CHARSET=latin1 

下面的查询将挥舞预期的结果:

SELECT Code, Date, Number 
FROM table_10357817 
GROUP BY Code 
HAVING Date = MAX(Date) 

本集团势力每一个单一的代码的结果(你把它叫做ID)并且HAVING子句仅返回与每个代码/ ID的最大日期相匹配的数据。

更新

用下面的数据脚本:

INSERT INTO table_10357817 
    (Code, Date, Number) 
VALUES 
    ('BH', '2012-09-01', 56789), 
    ('BH', '2011-09-01', 56765), 
    ('BH', '2010-08-01', 67866), 
    ('CH', '2012-09-01', 58789), 
    ('CH', '2011-09-01', 56795), 
    ('CH', '2010-08-01', 67866), 
    ('DH', '2012-09-01', 52789), 
    ('DH', '2011-09-01', 56665), 
    ('DH', '2010-08-01', 67866) 
相关问题