2017-01-12 8 views
1

Я использую базу данных ошибок Mantis (которая использует MySQL), и я хочу запросить, какие ошибки изменили их степень серьезности в течение последних 2 недель, однако только последнее изменение серьезности ошибка должна быть указана.MySQL: нежелательный результат с максимальной функцией на отметке времени

Проблема заключается в том, что я получаю несколько записей на каждый идентификатор ошибки (который является основным ключом), что не является моим желаемым результатом, так как я хочу иметь только последнее изменение за ошибку. Это означает, что каким-то образом я использую функцию max, а группу - неправомерно.

Здесь вы можете увидеть мой запрос:

SELECT `bug_id`, 
    max(date_format(from_unixtime(`mantis_bug_history_table`.`date_modified`),'%Y-%m-%d %h:%i:%s')) AS `Severity_changed`, 
    `mantis_bug_history_table`.`old_value`, 
    `mantis_bug_history_table`.`new_value` 
    from `prepared_bug_list` 
    join `mantis_bug_history_table` on `prepared_bug_list`.`bug_id` = `mantis_bug_history_table`.`bug_id` 
    where (`mantis_bug_history_table`.`field_name` like 'severity') 
    group by `bug_id`,`old_value`,`.`new_value` 
    having (`Severity_modified` >= (now() - interval 2 week)) 
    order by bug_id` ASC 

Для ошибки с идентификатором 8, например, я получаю три записи с этим запросом. Ошибка с идентификатором 8 действительно имела три изменения серьезности за последние 2 недели, но я хочу только получить самую последнюю степень серьезности.

В чем может быть проблема с моим запросом?

ответ

1

я, наконец, есть решение! Мой друг помог мне, и одна часть решения заключалась в том, чтобы включить ключ Primary таблицы истории ошибок мантиса, который не является идентификатором bug_id, а идентификатор столбца, который является последовательным числом. Другая часть решения была подзапрос в предложении где:

select `prepared_bug_list`.`bug_id` AS `bug_id`, 
`mantis_bug_history_table`.`old_value` AS `old_value`, 
`mantis_bug_history_table`.`new_value` AS `new_value`, 
`mantis_bug_history_table`.`type` AS `type`, 
date_format(from_unixtime(`mantis_bug_history_table`.`date_modified`),'%Y-%m-%d %H:%i:%s') AS `date_modified` 
FROM `prepared_bug_list` 
JOIN mantis_import.mantis_bug_history_table 
ON `prepared_bug_list`.`bug_id` = mantis_bug_history_table.bug_id 
where (mantis_bug_history_table.id = -- id = that is the id of every history entry, not confuse with bug_id 
    (select `mantis_bug_history_table`.`id` from `mantis_bug_history_table` 
    where ((`mantis_bug_history_table`.`field_name` = 'severity') 
    and (`mantis_bug_history_table`.`bug_id` = `prepared_bug_list`.`bug_id`)) 
    order by `mantis_bug_history_table`.`date_modified` desc limit 1) 
and `date_modified` > unix_timestamp() - 14*24*3600) 
order by `prepared_bug_list`.`bug_id`,`mantis_bug_history_table`.`date_modified` desc 
1

max() - функция агрегации, и она не подходит для того, что вы пытаетесь сделать.

У меня есть ощущение, что вы пытаетесь получить последнюю информацию из всех применимых bug_id в mantis_bug_history_table. Если это правда, то я бы переписать запрос как следующее - я бы написать подзапрос getLatest и присоединиться к нему с prepared_bug_list

Обновленный ответ

Внимание: У меня нет доступа к фактическим таблицам БД, так этот запрос может иметь ошибки

select 
    `getLatest`.`last_bug_id` 
    , `mantis_bug_history_table`.`date_modified` 
    , `mantis_bug_history_table`.`old_value` 
    , `mantis_bug_history_table`.`new_value` 
from 
    (
     select 
       (
       select 
        `bug_id` 
       from 
        `mantis_bug_history_table` 
       where 
        `date_modified` > unix_timestamp() - 14*24*3600 -- two weeks 
        and `field_name` like 'severity' 
        and `bug_id` = `prepared_bug_list`.`bug_id` 
       order by 
        `date_modified` desc 
       limit 1 
      ) as `last_bug_id` 
     from 
      `prepared_bug_list` 
    ) as `getLatest` 
    inner join `mantis_bug_history_table` 
      on `prepared_bug_list`.`bug_id` = `getLatest`.`last_bug_id`  
order by `getLatest`.`bug_id` ASC 
+0

Спасибо за ваш быстрый ответ, однако я не понимаю, как присоединился к подзапрос (getLatest) поможет. Предел 1 говорит, что я получу только одну строку для всего запроса (это только одна ошибка, для которой я вижу результаты). Я думаю, что ваше намерение с помощью подзапроса состояло в том, чтобы получить последний результат за каждый баг, отсортировав дату в порядке убывания (который ставит последние в верхней части) и предел его с 1 результатом за ошибку, но он не работает так, как вы предполагали , –

+1

@Bruder - У меня нет доступа к вашей БД, поэтому я не могу отлаживать свой запрос, кроме как просто сгладить его. Вы можете устранить неполадки, просто вытащив подзапрос и посмотрев, что он получит. Возможно, в ваших данных была действительно одна ошибка за последние две недели? Удачи! (Или вы можете поместить свои данные и таблицу на SqlFiddle.com, и я могу продолжить отладку моего запроса.) – leeyuiwah

+0

Нет, в течение последних 2 недель имеется несколько записей для нескольких ошибок. Но для всех этих ошибок я хотел получить последнюю запись для каждой ошибки. Подзапрос, который вы предположили, не работает в моем случае. –

Смежные вопросы