【问题标题】:SQL: Take only the latest entry for each "group"?SQL:只取每个“组”的最新条目?
【发布时间】:2013-07-05 17:55:44
【问题描述】:

在这里我创建了一些表来测试:

CREATE TABLE IF NOT EXISTS `test` (
  `index` varchar(255) NOT NULL,
  `index2` varchar(255) NOT NULL,
  `date` date NOT NULL,
  `somenumber` int(10) NOT NULL,
  PRIMARY KEY (`index`,`index2`,`date`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

INSERT INTO `test` (`index`, `index2`, `date`, `somenumber`) VALUES
('kevin', 'little', '2013-06-11', 1),
('kevin', 'little', '2013-07-03', 5),
('maria', 'smith', '2013-07-01', 3),
('martin', 'luther', '2013-07-04', 13),
('martin', 'luther', '2013-07-05', 14);

现在我想为大家获取最新的somenumber,由somenumber DESC 订购。这是我的尝试:

SELECT * FROM `test` GROUP BY `index`, `index2` ORDER BY `somenumber` DESC

问题是这个查询总是为每个组取一个 somenumber,但它并不总是最新的。

(我知道索引名在这里没有太大意义,但我认为这将是一个比使用随机数索引更容易阅读的示例)

【问题讨论】:

  • 如果你想插入最新的记录,不要把它留为ORDER BY somenumber;
  • 你的意思是最新的日期?
  • 是的,我想要date 行定义“最新”的每个人的最新号码。

标签: mysql sql greatest-n-per-group


【解决方案1】:

希望对你有帮助

SELECT * 
FROM  
    (SELECT * FROM `test`  ORDER BY `index`, `date` DESC) as temp
GROUP BY `index`, `index2` 
ORDER BY `somenumber` DESC

【讨论】:

【解决方案2】:

试试这个:

SELECT t1.`INDEX`, t1.`INDEX2`, t1.`SOMENUMBER` FROM TEST t1 INNER JOIN
(SELECT `INDEX`, `INDEX2`, MAX(`DATE`) DATE FROM TEST
GROUP BY `INDEX`, `INDEX2`) t2 ON t1.INDEX = t2.INDEX AND t1.INDEX2 = t2.INDEX2 AND t1.DATE = t2.DATE

【讨论】:

  • #1052 - Column 'INDEX' in field list is ambiguous
  • 我现在已经在一个相当大的示例数据库中测试了这两个答案,这个查询要快得多。现在将此标记为正确答案。非常感谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-06
  • 1970-01-01
  • 2017-02-18
  • 2023-02-06
  • 1970-01-01
相关资源
最近更新 更多