Как отобразить столбец сроков в отчетах о трассах?

У меня установлен trac для управления моими онлайн-проектами. Я также установил плагин даты DateFieldPlugin в нем. Я не могу показать эту дату в пользовательских отчетах.

Следующий код генерирует нормальный отчет.

SELECT p.value AS __color__,
owner AS __group__,
id AS ticket, severity, summary, component, milestone, t.type AS type, time AS created,
changetime AS _changetime, description AS _description,reporter AS _reporter
FROM ticket t
LEFT JOIN enum p ON p.name = t.priority AND p.type = 'priority'
WHERE status = 'assigned'
ORDER BY owner, p.value, t.type, time

и я хочу что-то вроде этого:

SELECT p.value AS __color__,
owner AS __group__,
id AS ticket, severity, summary, component, milestone, t.type AS type, time AS created,
changetime AS _changetime, description AS _description,
reporter AS _reporter, c.value AS Duedate
FROM ticket t
LEFT JOIN enum p ON p.name = t.priority AND p.type = 'priority', ticket_custom c
WHERE status = 'assigned'
ORDER BY owner, p.value, t.type, time

Приведенный выше код показывает мне столбец срока выполнения, хотя он показывает одну строку задачи несколько раз.

Кто-нибудь может мне помочь в этом?

2 ответа

Решение

Дерек уволился. Тем не менее, вот рабочий:

SELECT p.value AS __color__,
owner AS __group__,
id AS ticket, severity, summary, component, milestone, t.type AS type, time AS created,
changetime AS _changetime, description AS _description,
reporter AS _reporter, c.value AS Duedate
FROM ticket t
LEFT JOIN enum p ON p.name = t.priority AND p.type = 'priority'
LEFT OUTER JOIN ticket_custom c ON t.id = c.ticket AND c.name = 'due_date'
WHERE status = 'assigned'
ORDER BY owner, p.value, t.type, time

Только вам придется заменить значение c.name, чтобы оно совпадало с именем вашего поля даты, если оно не "due_date", как в моей конфигурации.

Справочная информация: определение таблицы ticket_custom - это всего лишь одна пара ключ-значение на строку, так как вызов схемы показывает:

sqlite> .schema ticket_custom
CREATE TABLE ticket_custom (
    ticket integer,
    name text,
    value text,
    UNIQUE (ticket,name)
);

Обратите внимание, что первичный ключ - это не только номер билета, но и имя билета (номер) и (пользовательский столбец). Следовательно, для JOIN требуется дополнительное предложение WHERE, иначе вы все равно получите несколько строк - по одной для каждого настраиваемого поля всех соответствующих заявок. Это в отличие от основной таблицы "тикет", где вся информация для одного тикета находится в одной строке.

Вы не указываете условие соединения на ticket_custom, Поэтому он делает CROSS JOIN, который присоединяется к каждой записи из ticket_custom к каждой записи в остальной части вашего запроса. Так что если ваш ticket left join enum изначально вернул 100 строк, и ticket_custom имеет 20, у вас будет 2000 результирующих строк во втором запросе.

Вам необходимо определить, как ticket_custom относится к другим таблицам, и предоставить соответствующий предикат. Скорее всего, это что-то вроде этого:

SELECT p.value AS __color__,
owner AS __group__,
id AS ticket, severity, summary, component, milestone, t.type AS type, time AS created,
changetime AS _changetime, description AS _description,
reporter AS _reporter, c.value AS Duedate
FROM ticket t
LEFT JOIN enum p ON p.name = t.priority AND p.type = 'priority'
LEFT JOIN ticket_custom c ON t.id = c.ticket_id
WHERE status = 'assigned'
ORDER BY owner, p.value, t.type, time

(См. Новую строку слева). Столбцы являются предположением - вам нужно будет заменить те столбцы, которые правильно соотносят две таблицы.

Другие вопросы по тегам