我有以下(简化)数据库架构:
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
然而,这将是很多疑问。
我只能使用一个查询获得相同的内容吗?
答案 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
左连接和不相关子查询被认为在性能方面更好。