#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. Что я сделал, так это изменил группировку на ГРУППИРОВКУ ПО имени, описанию, проблеме, времени, и сейчас это хорошо, но я буду наблюдать за этим. спасибо Марку, что указал мне.