我有产品表......
alt text http://img357.imageshack.us/img357/6393/productscx5.gif
和修订表,用于跟踪产品信息的更改
alt text http://img124.imageshack.us/img124/1139/revisionslz5.gif
我尝试在数据库中查询所有产品及其最新版本......
select
*
from `products` as `p`
left join `revisions` as `r` on `r`.`product_id` = `p`.`product_id`
group by `p`.`product_id`
order by `r`.`modified` desc
但我总是得到第一次修订。我需要在一个选择(即没有子查询)中执行此操作。我可以在mssql中管理它,这在mysql中是否可能?
答案 0 :(得分:4)
我是这样做的:
SELECT p.*, r.*
FROM products AS p
JOIN revisions AS r USING (product_id)
LEFT OUTER JOIN revisions AS r2
ON (r.product_id = r2.product_id AND r.modified < r2.modified)
WHERE r2.revision_id IS NULL;
换句话说:找到没有其他修订版本的修订版本具有相同的product_id和更大的修改值。
答案 1 :(得分:1)
历史记录表上的开始日期和结束日期将使这成为可能。(在插入新记录时,将最近结束日期保留为空并在上一记录上标记结束日期)
否则你将不得不使用子查询。
答案 2 :(得分:0)
同样的查询在MySQL中是可解析的。
为什么使用Left JOIN而不是INNER join或RIGHT join?
此外,如果您想以不同的方式解决这个问题,您可以使用MAX功能。