MySQL запрос, который дает самую последнюю версию для каждой сущности - PullRequest
2 голосов
/ 30 августа 2010

Мои данные разделены на две таблицы. Одна из них - это таблица сущностей, в которой описываются основы сущности, и таблица редакций, в которой находятся данные сущности. Если я знаю объект, я могу запросить самую последнюю версию:

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 ]

1 голос
/ 31 августа 2010

Я предлагаю придерживаться чего-то простого:

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 и с предложениями. Однако группировка по будет длинной, так как вам придется включить все столбцы из e и r1.

, например

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`)
0 голосов
/ 30 августа 2010

я не совсем понял, что вы пытаетесь сделать ... но я думаю, что вы хотите сделать, это перечислить все объекты, включая дату их последнего изменения ... если это так, вы можете использовать GROUPBY, и функция 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

Кстати ... я бы изменил имя "entity_fk" на "entity_id", это немного сбивает с толку ... по крайней мере, для меня =)

0 голосов
/ 30 августа 2010

Если я читаю ваш вопрос правильно, это будет делать:

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.

...