【问题标题】:Limit results to x groups将结果限制为 x 组
【发布时间】:2017-05-09 19:05:42
【问题描述】:

我正在使用 Trac 开发一个系统,我想限制返回的“更改日志”条目的数量。问题在于,Trac 使用union 从多个表中整理这些条目,然后根据它们的时间戳将它们组合成单个“变更集”。我希望将结果限制为最新的,例如3 个变更集,但这需要检索尽可能多的行,直到我获得 3 个唯一时间戳。解决方案需要适用于 SQLite/Postgres。

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 个时间戳)

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

【问题讨论】:

    标签: sql grouping limit trac


    【解决方案1】:

    正如您自己已经指出的那样,由于结果数量不确定,这无法在 SQL 中解决。而且我认为这甚至不是必需的。

    您可以使用稍作修改的trac/ticket/templates/ticket.html Genshi 模板来获得您想要的。改变

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

    进入

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

    并将文件放入&lt;env&gt;/templates/ 重新启动您的网络服务器。但是,当您尝试升级 Trac 安装时,请注意对 ticket.html 的更改。每次执行此操作时,您可能需要在相应版本的当前模板上重新应用此更改。但恕我直言,它仍然比修补 Trac 核心代码更快、更干净。

    【讨论】:

    • 谢谢。最后,我基本上选择了这样做(尽管我们的模板与 vanilla trac 有很大不同)。我已将 get_changelog 更改为生成器功能,它也应该加快速度。我知道,即使我要使用 SQL 来执行此操作,那也会是一个令人困惑的语句,但我仍然觉得获得所有结果然后只使用一些结果不会为我节省那么多时间。
    【解决方案2】:

    如果您只需要三个记录(如“数据限制 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
    

    【讨论】:

    • 戈登,感谢您的回复。对不起,我的例子可能有点不清楚。第二个 sn-p 是为了显示如果我要设置一个限制 1 我想要什么(我这样做只是为了让结果集可能很小)。第一个 sn-p 显示当前 SQL 语句返回的内容。请注意unions 'ticket_change' 和 'attachment' 等表。该功能需要保留。
    猜你喜欢
    • 2013-11-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-22
    • 2018-07-08
    • 2019-11-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多