2013-06-21 3 views
0

Я разрабатываю систему с использованием Trac, и я хочу ограничить количество возвращаемых записей «changelog». Проблема заключается в том, что 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 Result (Ограничена 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 

ответ

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:]"> 

и поместить файл в <env>/templates/ рестарта вашего веб-сервера. Но следите за изменениями в ticket.html, всякий раз, когда вы пытаетесь обновить свою установку Trac. Каждый раз, когда вы это делаете, вам может потребоваться повторное применение этого изменения в текущем шаблоне соответствующей версии. Но IMHO его все еще намного быстрее и чище, чем исправлять основной код 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» и «attachment» и т. Д. Эта функциональность должна оставаться. –