2013-06-21 119 views
0

我正在開發使用的Trac系統,我想限制數量「更新日誌」條目返回。問題在於Trac使用union對來自多個表的這些條目進行整理,然後根據它們的時間戳稍後將它們組合爲單個「更改集」。我希望將結果限制在最新的例如3個變更集,但這需要根據需要檢索儘可能多的行,直到獲得3個獨特的時間戳。解決方案需要爲SQLite/Postgres工作。搜索結果限制爲X基團

Trac's current SQL

當前SQL結果

Time    User Field   oldvalue newvalue permanent 
======================================================================= 
1371806593507544 a  owner   b   c   1 
1371806593507544 a  comment  2   lipsum  1 
1371806593507544 a  description foo  bar   1 
1371806593324529 b  comment  hello  world  1 
1371806593125677 c  priority  minor  major  1 
1371806592492812 d  comment  x   y   1 

預期SQL結果(限1個時間戳EG)

Time    User Field   oldvalue newvalue permanent 
======================================================================= 
1371806593507544 a  owner   b   c   1 
1371806593507544 a  comment  2   lipsum  1 
1371806593507544 a  description foo  bar   1 

回答

1

正如你已經指出了你自己的,這不能在SQL解析由於未定數量的結果。我認爲這甚至不是必需的。

您可以使用稍微修改trac/ticket/templates/ticket.html元史模板來得到你想要的。更改

 <div id="changelog"> 
     <py:for each="change in changes"> 

 <div id="changelog"> 
     <py:for each="change in changes[-3:]"> 

和文件放入<env>/templates/重新啓動Web服務器。但要注意對ticket.html所做的更改,無論何時嘗試升級Trac安裝。每當您這樣做時,您可能需要在相應版本的當前模板上重新應用此更改。但恕我直言,它仍然比修補Trac核心代碼更快,更乾淨。

+0

謝謝你。最後我選擇了基本做到這一點(儘管我們的模板與香草trac有很大不同)。我已經將get_changelog更改爲一個生成器函數,它也可以加快速度。我明白,即使我是用SQL來做這件事,那也是一個令人困惑的陳述,但我仍然想要得到所有的結果,然後只用幾個就不會爲我節省很多時間。 –

0

如果你只想三個記錄(如「數據限制1」結果集),則可以使用limit

select * 
from t 
order by time desc 
limit 3 

如果你想爲最近的三個時間戳的所有記錄,你可以使用一個連接:

select t.* 
from t join 
    (select distinct time 
     from t 
     order by times desc 
     limit 3 
    ) tt 
    on tt.time = t.time 
+0

戈登,感謝您的回覆。對不起,我的例子可能略有不清。第二個片段是爲了展示我想要的,如果我要設置1的限制(我這樣做只是爲了使結果集可能很小)。第一個片段顯示了當前的SQL語句返回的內容。請注意,它'聯合'表'ticket_change'和'附件'等。該功能將需要保留。 –