Реализовать MIN или получить наименьшую запись

#mysql #join

#mysql #Присоединиться

Вопрос:

Я хотел бы попросить помощи о том, как это исправить. Я хотел бы добавить MIN или какой-то запрос, чтобы показывать только наименьшее число в базе totalTime в приведенном ниже запросе SQL.

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

Заранее спасибо.

 SELECT DISTINCT t1.name, 
  t1.Description, 
  t1.Issue, 
  t1.Dateres AS ATime, 
  t2.Dateres AS BAck, 
  TIMEDIFF(t2.Dateres,t1.Dateres) AS TotalTime, 
  t2.Acknowledge, t2.Resolution 
FROM t1
LEFT JOIN t2 ON t1.name = t2.name 
  AND t1.IPAddress = t2.IPAddress 
  AND t1.Description = t2.Description 
  AND t1.Issue = t2.Issue 
  AND t1.Severity = t2.Severity 
  AND t1.Timestamp = t2.Timestamp 
WHERE t1.Dateres IS NOT NULL
  AND t2.Dateres IS NOT NULL 
  AND t2.Acknowledge = 'user@home.net' 
  AND t2.Dateres >= '2011-10-18 00:00:00' 
  AND t2.Dateres <= '2011-10-23 23:59:59' 
GROUP BY ATime
ORDER by BAck ASC;
  

Комментарии:

1. Разве в этих таблицах нет первичного и внешнего ключей? Условие соединения довольно своеобразно.

2. Вы уверены, что хотите сгруппировать по ATime , но затем выбрать поля типа Description и Issue без агрегатной функции? Description Функционально зависит от ATime ?

3. Description и Issue и t2.Dateres

4. ypercube, таблицы не имеют первичных и внешних ключей, поскольку они генерируются системой.

5. Отметьте, похоже, я получаю хорошие результаты, изменяя название группы, описание, проблему, но я продолжу тестирование.

Ответ №1:

 SELECT 
t1.name, 
t1.Description, 
t1.Issue, 
t1.Dateres AS ATime, 
t2.Dateres AS BAck, 
Min(TIMEDIFF(t2.Dateres,t1.Dateres)) AS TotalTime, 
t2.Acknowledge, t2.Resolution 
FROM t1 LEFT JOIN t2 ON t1.name = t2.name 
AND t1.IPAddress = t2.IPAddress 
AND t1.Description = t2.Description 
AND t1.Issue = t2.Issue 
AND t1.Severity = t2.Severity 
AND t1.Timestamp = t2.Timestamp 
WHERE t1.Dateres is NOT NULL AND t2.Dateres is NOT NULL 
AND t2.Acknowledge = 'user@home.net' 
AND t2.Dateres >= '2011-10-18 00:00:00' 
AND t2.Dateres <= '2011-10-23 23:59:59' 
GROUP BY t1.name ORDER by BAck ASC;
  

Ответ №2:

Надеюсь, это сработает:::

 SELECT DISTINCT t1.name, 
t1.Description, 
t1.Issue, 
t1.Dateres AS ATime, 
t2.Dateres AS BAck, 
Min(TIMEDIFF(t2.Dateres,t1.Dateres)) AS TotalTime, 
t2.Acknowledge, t2.Resolution 
FROM t1 LEFT JOIN t2 ON t1.name = t2.name 
AND t1.IPAddress = t2.IPAddress 
AND t1.Description = t2.Description 
AND t1.Issue = t2.Issue 
AND t1.Severity = t2.Severity 
AND t1.Timestamp = t2.Timestamp 
WHERE t1.Dateres is NOT NULL AND t2.Dateres is NOT NULL 
AND t2.Acknowledge = 'user@home.net' 
AND t2.Dateres >= '2011-10-18 00:00:00' 
AND t2.Dateres <= '2011-10-23 23:59:59' 
GROUP BY ATime ORDER by BAck ASC;
  

Комментарии:

1. Я думаю, что это лучше: TIMEDIFF(MIN(t2.Dateres),t1.Dateres)

2. Я попробовал Min(TIMEDIFF(t2.Dateres,t1.Dateres)) КАК totalTime, так и TIMEDIFF (MIN(t2.Dateres), t1.Dateres) оба по-прежнему показывают несколько записей.

3. Я хочу группировать записи и показывать результаты только в том случае, если они совпадают, поэтому мне нужно реализовать что-то, что игнорирует повторяющуюся запись и показывает только запись с наименьшим значением totalTime. Что я сделал, так это изменил группировку на ГРУППИРОВКУ ПО имени, описанию, проблеме, времени, и сейчас это хорошо, но я буду наблюдать за этим. спасибо Марку, что указал мне.