2013-06-21 83 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'和'附件'等。该功能将需要保留。 –