2013-04-09 3 views
0

Я пытался получить статус, поэтому я могу узнать, сколько времени прошло для изменения ошибки, его статус «разрешен», так что у меня есть следующий SQL-код :Получение последнего результата ошибки, которая была устранена

select bug.id, 
     bug.project_id, 
     DATEDIFF (FROM_UNIXTIME(his.date_modified), FROM_UNIXTIME(date_submitted)) as dias_resolucao, 
     DATE_FORMAT(FROM_UNIXTIME(his.date_modified), '%Y-%m') as ano_mes 
from mantis_bug_table bug 
left join mantis_project_table pro on bug.project_id = pro.id 
left join mantis_custom_field_string_table cus on bug.id = cus.bug_id 
left join mantis_bug_history_table his on bug.id = his.bug_id 
where bug.category_id = 1 and 
     (cus.field_id=1 or cus.field_id is null) and  
     his.new_value = 80 and 
     his.field_name = 'status' and     
     bug.id = 5171 and 
     cus.value='Sim'  
having his.date_modified = max(his.date_modified) 

проблема заключается в том, что я знал, почему делает это печать следующее сообщение об ошибке:

[SELECT - 0 row(s), 0.000 secs] 
[Error Code: 1054, SQL State: 42S22] 
Unknown column 'his.date_modified' in 'having clause' 

Запуск же SQL, без имеющего пункт приносит мне следующий результат:

╔══════╦════════════╦════════════════╦═════════╗ 
║ id ║ project_id ║ dias_resolucao ║ ano_mes ║ 
╠══════╬════════════╬════════════════╬═════════╣ 
║ 5171 ║   4 ║    17 ║ 2012-12 ║ 
║ 5171 ║   4 ║    18 ║ 2012-12 ║ 
╚══════╩════════════╩════════════════╩═════════╝ 

Любая помощь приветствуется.

+0

проверить наличие столбца 'date_modified' в таблице' mantis_bug_history_table' –

+0

his.date_modified отсутствует в предложении select, поэтому неизвестна ошибка столбца. – Neo

+0

@SuhelMeman он существует, так как он также используется в select, только для форматирования. – aimbire

ответ

2

Попробуйте.

SELECT his.date_modified, bug.id, 
     bug.project_id, 
     DATEDIFF (FROM_UNIXTIME(his.date_modified), FROM_UNIXTIME(date_submitted)) AS dias_resolucao, 
     DATE_FORMAT(FROM_UNIXTIME(his.date_modified), '%Y-%m') AS ano_mes 
FROM mantis_bug_table bug 
LEFT JOIN mantis_project_table pro ON bug.project_id = pro.id 
LEFT JOIN mantis_custom_field_string_table cus ON bug.id = cus.bug_id 
LEFT JOIN mantis_bug_history_table his ON bug.id = his.bug_id 
WHERE bug.category_id = 1 AND 
     (cus.field_id=1 OR cus.field_id IS NULL) AND  
     his.new_value = 80 AND 
     his.field_name = 'status' AND     
     bug.id = 5171 AND 
     cus.value='Sim'  
HAVING his.date_modified = MAX(his.date_modified) 
+0

Он не выдает ошибки, но все же я получаю сообщение: «Пустой набор результатов выбран». – aimbire

+1

Может возникнуть проблема с функцией max. Замените MAX (his.date_modified) на (SELECT MAX (h.date_modified) FROM mantis_bug_history_table AS h WHERE bug.id = h.bug_id) – Neo

+0

Спасибо, мне все же пришлось настроить предложение HAVING, поскольку оно не принималось во внимание как столбцы проверяются в предложении WHERE, но я отредактировал ответ, чтобы он оставался для тех, у кого есть проблемы с этим в будущем. – aimbire

0

Пара вещей. Во-первых, я не думаю, что вы можете использовать псевдонимы в предложении HAVING по умолчанию. Возможно, я ошибаюсь, у меня проблемы с обработкой документации here. Таким образом, строка HAVING должна больше походить на `HAVING mantis_bug_history_table.date_modified = MAX (mantis_bug_history_table.date_modified)

Возможно, я ошибался. Тем не менее, я думаю, вам понадобится сделать самостоятельное соединение, чтобы получить MAX date_modified. Что-то вроде этого:

select bug.id, 
     bug.project_id, 
     DATEDIFF (FROM_UNIXTIME(his.date_modified), FROM_UNIXTIME(date_submitted)) as dias_resolucao, 
     DATE_FORMAT(FROM_UNIXTIME(his.date_modified), '%Y-%m') as ano_mes 
from mantis_bug_table bug 
left join mantis_project_table pro on bug.project_id = pro.id 
left join mantis_custom_field_string_table cus on bug.id = cus.bug_id 
left join mantis_bug_history_table his on bug.id = his.bug_id 
inner join (select bug_id, max(date_modified) as max_date_modified from mantis_bug_history_table group by bug_id) as his_max_dates 
on his.bug_id = his_max_dates.bug_id and his.date_modified = his_max_dates.max_date_modified 
where bug.category_id = 1 and 
     (cus.field_id=1 or cus.field_id is null) and  
     his.new_value = 80 and 
     his.field_name = 'status' and     
     bug.id = 5171 and 
     cus.value='Sim'  

Дайте это попробовать.