2010-08-30 84 views
2

我將數據拆分爲兩個表。一個是實體表,它描述實體的基礎知識,以及實體數據所在的修訂表。如果我知道我的實體可以查詢最新版本:提供每個實體的最新版本的mysql查詢

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 

回答

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中的所有列。

例如

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

如果我在讀你的問題的權利,這將做到:

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下令雖然結果集。

0

我不完全瞭解你正在嘗試做的...但我認爲你需要做的是列出所有的實體,包括他們的最後修改日期..如果僅此而已,你可以使用GROUP BY,像這樣

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一個MAX()函數..我會改變的 「entity_fk」 到 「ENTITY_ID」,這個名字它有點混亂..至少對我來說=)

+0

entity_FK是實體表的PK。它是網站特定的語法標準。 – 2010-08-30 20:30:53