Получение последнего результата исправленной ошибки

Я пытался получить статус, поэтому я могу узнать, сколько времени потребовалось для изменения ошибки, ее статус «разрешен», поэтому у меня есть следующий 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 без предложения has дает мне следующий результат:

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

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


person aimbire    schedule 09.04.2013    source источник
comment
проверить наличие столбца date_modified в таблице mantis_bug_history_table   -  person Suhel Meman    schedule 09.04.2013
comment
his.date_modified отсутствует в операторе select, поэтому возникает ошибка неизвестного столбца.   -  person Dieepak    schedule 09.04.2013
comment
@SuhelMeman существует, так как он также используется в выборе, только что отформатирован.   -  person aimbire    schedule 09.04.2013


Ответы (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)
person Dieepak    schedule 09.04.2013
comment
Это не выдает ошибку, но все же я получаю сообщение: Выбран пустой набор результатов. - person aimbire; 09.04.2013
comment
Может быть проблема с функцией max. Замените MAX(his.date_modified) на (SELECT MAX(h.date_modified) FROM mantis_bug_history_table AS h WHERE bug.id = h.bug_id) - person Dieepak; 09.04.2013
comment
Спасибо, мне все же пришлось настроить предложение HAVING, так как оно не учитывалось при проверке обоих столбцов в предложении WHERE, но я отредактировал ответ, чтобы он оставался для тех, у кого возникнут проблемы с этим в будущем. - person aimbire; 09.04.2013

Пара вещей. Во-первых, я не думаю, что вы можете использовать псевдонимы в предложении HAVING по умолчанию. Я могу ошибаться, у меня проблемы с разбором документации здесь. Таким образом, строка 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'      

Попробуйте.

person dlp    schedule 09.04.2013