Как отобразить столбец сроков в отчетах о трассах?
У меня установлен 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
(См. Новую строку слева). Столбцы являются предположением - вам нужно будет заменить те столбцы, которые правильно соотносят две таблицы.