一个mysql查询,它为每个实体提供最新版本

时间:2010-08-30 18:18:17

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

我将数据拆分为两个表。一个是实体表,其中描述了实体的基础知识,以及实体数据所在的修订表。如果我知道我可以查询最新版本的实体:

SELECT *
FROM `entities`
  JOIN (SELECT *
        FROM `revisions`
        WHERE `entity_fk` = ?
        ORDER BY `revised` DESC
        LIMIT 0, 1) as `revision`
    ON `entities`.`id` = `revision`.`entity_fk`

但现在我需要使用最新版本的数据列出所有实体。

revisions table
+--+---------+---------+--------------------+-------------------+
|id|entity_fk|title    |body                |revised            |
+==+=========+=========+====================+===================+
|01|    01   |Hentity A|This Is tH3 first...|2010-08-30 10:02:45|
|02|    01   |Entity A |This is the first...|2010-08-30 10:16:30|
|03|    02   |Entity B |This is another...  |2010-08-30 10:20:20|

查询应返回的是每个实体的最新修订列表,而不仅仅是指定的实体。

2,1,Entity A,This is the first...,2010-08-30 10:16:30
3,2,Entity B,This is another...,2010-08-30 10:20:20

3 个答案:

答案 0 :(得分:1)

我建议坚持简单的事情:

select *
from `entities` e join `revisions` r1
  on e.`id` = r1.`entity_fk`
where r1.`revised` = ( 
   select max(r2.`revised`)
   from `revisions` r2
   where r1.`entity_fk` = r2.`entity_fk`
)

如果mysql不支持标量子查询,我建议在group by和having子句的修订版上使用自联接。但是,group by将会很长,因为您必须包含e和r1中的所有列。

e.g。

select e.*, r1.*
from `entities` e join `revisions` r1
  on e.`id` = r1.`entity_fk`
join `revisions` r2
  on r1.`entity_fk` = r2.`entity_fk`
group by ...
having r1.`revised` = max(r2.`revised`)

答案 1 :(得分:0)

如果我正在读你的问题,那就行了:

select
    *
from
    `entities` as e,
    `revisions` as r
where
    r.entity_fk=e.id
group by
    e.id
order by
    r.revised desc

您可以获得revisions.revised排序的结果集。

答案 2 :(得分:0)

我并不完全明白你要做什么...但我认为你要做的是列出所有实体,包括他们最后一次修改的日期..如果就是这样,你可以使用一个GROUP BY和一个像这样的MAX()函数

SELECT e.title,e.body,MAX(r.revised) FROM `entities` e JOIN `revisions` r ON r.entity_fk = e.id GROUP BY e.title,e.body

BTW ..我将“entity_fk”的名称更改为“entity_id”,这有点令人困惑..至少对我而言=)