如何使用一个SQL查询获取每个外键ID的最新数据集?

时间:2014-12-10 10:33:17

标签: mysql sql

我有以下(简化)数据库架构:

CREATE TABLE IF NOT EXISTS `wm_renderings` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `formula_id` int(11) NOT NULL,
  `creation_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `svg` text COLLATE utf8_bin NOT NULL,
  PRIMARY KEY (`id`),
  KEY `formula_id` (`formula_id`)
);

其中formula_id是外键。

我想为每个formula_id获取最新的渲染。但是当我写作

SELECT `id`, `formula_id`, `svg`
FROM `wm_renderings`
GROUP BY `formula_id`
ORDER BY `creation_time` DESC

我会为每个formula_id获得一个“随机”渲染。

我的方法是获取所有公式ID,然后为每个formula_id发送一个查询:

SELECT `id`, `formula_id`, `svg`
FROM `wm_renderings`
WHERE `formula_id` = 42
ORDER BY `creation_time` DESC
LIMIT 1

然而,这将是很多疑问。

我只能使用一个查询获得相同的内容吗?

1 个答案:

答案 0 :(得分:1)

每个小组获得max / latest的方式可以通过多种方式完成,其中一种方法是使用left join

select t1.* from wm_renderings t1
left join wm_renderings t2 on t1.formula_id = t2.formula_id
and t1.creation_time < t2.creation_time
where t2.id is null

这是关于它的文档

http://dev.mysql.com/doc/refman/5.0/en/example-maximum-column-group-row.html

左连接和不相关子查询被认为在性能方面更好。