#sql #group-by #mariadb #sql-order-by
#sql #группировать по #mariadb #sql-порядок-по
Вопрос:
У меня есть очень простая Maria DB для домашней автоматизации. Это основная выдержка из моего ER:
TelldusActionsPerformed
является таблицей журнала. Он используется для отслеживания самых разных действий (таких как измерение температуры, закрытие двери, включение выключателя питания и т.д.), Выполняемых в разное время.
Я использую следующий запрос для извлечения интересных данных:
SELECT
TelldusActionsPerformed.PerformedTime AS TelldusActionsPerformed_PerformedTime,
TelldusUnits.Name AS TelldusUnits_Name,
TelldusActionValues.ActionValue AS TelldusActionValues_ActionValue,
TelldusActionValueTypes.Name AS TelldusActionValueTypes_Name
FROM
TelldusActions
INNER JOIN TelldusUnits ON TelldusActions.FK_TelldusUnit_Id = TelldusUnits.Id
INNER JOIN TelldusActionTypes ON TelldusActions.FK_TelldusActionType_Id = TelldusActionTypes.Id
INNER JOIN TelldusActionValues ON TelldusActions.FK_TelldusActionValue_Id = TelldusActionValues.Id
INNER JOIN TelldusActionValueTypes ON TelldusActionValues.FK_TelldusActionValueType_Id = TelldusActionValueTypes.Id
INNER JOIN TelldusActionsPerformed ON TelldusActionsPerformed.FK_TelldusAction_Id = TelldusActions.Id
WHERE TelldusUnits.Name IN ("Grovkök golvtermostat", "Huvudtermostat", "Uterum golvtermostat")
AND TelldusActionValueTypes.Name IN ("watt","temp")
ORDER BY TelldusActionsPerformed.PerformedTime DESC
Это дает мне результирующий набор, который выглядит следующим образом
Я хотел бы уточнить свой запрос, чтобы возвращать только абсолютно последние (по времени) уникальные комбинации для TelldusUnits.Name
TelldusActionValueTypes.Name
полей:
Я считаю, что мне нужно GROUP BY TelldusUnits.Name, TelldusActionValueTypes.Name
получить уникальные комбинации? Возможно ли ограничить мой результат поиска последними уникальными комбинациями для TelldusUnits.Name
TelldusActionValueTypes.Name
полей только с SQL? Как?
Редактировать 1:
Если я запущу скрипт мистера Мурильо прямо из коробки (я только добавил FROM_UNIXTIME(), забыл его в своем первоначальном вопросе):
SELECT
FROM_UNIXTIME(MAX(TelldusActionsPerformed.PerformedTime)) AS TelldusActionsPerformed_PerformedTime,
TelldusUnits.Name AS TelldusUnits_Name,
TelldusActionValues.ActionValue AS TelldusActionValues_ActionValue,
TelldusActionValueTypes.Name AS TelldusActionValueTypes_Name
FROM
TelldusActions
INNER JOIN TelldusUnits ON TelldusActions.FK_TelldusUnit_Id = TelldusUnits.Id
INNER JOIN TelldusActionTypes ON TelldusActions.FK_TelldusActionType_Id = TelldusActionTypes.Id
INNER JOIN TelldusActionValues ON TelldusActions.FK_TelldusActionValue_Id = TelldusActionValues.Id
INNER JOIN TelldusActionValueTypes ON TelldusActionValues.FK_TelldusActionValueType_Id = TelldusActionValueTypes.Id
INNER JOIN TelldusActionsPerformed ON TelldusActionsPerformed.FK_TelldusAction_Id = TelldusActions.Id
WHERE TelldusUnits.Name IN ("Grovkök golvtermostat", "Huvudtermostat", "Uterum golvtermostat")
AND TelldusActionValueTypes.Name IN ("watt","temp")
GROUP BY TelldusUnits.Name, TelldusActionValues.ActionValue, TelldusActionValueTypes.Name
ORDER BY TelldusActionsPerformed.PerformedTime DESC
Я получаю следующий набор результатов:
ORDER BY TelldusActionsPerformed.PerformedTime DESC
Меня смущает. Таблица, похоже, не является упорядоченным потомком в соответствии с PerformedTime
? ( PerformedTime
, временная метка UNIX имеет тип данных int(11) )
Редактировать 2:
Следующее обновление, касающееся commnt мистера Мурильо, дало мне лучшую сортировку:
SELECT
FROM_UNIXTIME(MAX(TelldusActionsPerformed.PerformedTime)) AS TelldusActionsPerformed_PerformedTime,
TelldusUnits.Name AS TelldusUnits_Name,
TelldusActionValues.ActionValue AS TelldusActionValues_ActionValue,
TelldusActionValueTypes.Name AS TelldusActionValueTypes_Name
FROM
TelldusActions
INNER JOIN TelldusUnits ON TelldusActions.FK_TelldusUnit_Id = TelldusUnits.Id
INNER JOIN TelldusActionTypes ON TelldusActions.FK_TelldusActionType_Id = TelldusActionTypes.Id
INNER JOIN TelldusActionValues ON TelldusActions.FK_TelldusActionValue_Id = TelldusActionValues.Id
INNER JOIN TelldusActionValueTypes ON TelldusActionValues.FK_TelldusActionValueType_Id = TelldusActionValueTypes.Id
INNER JOIN TelldusActionsPerformed ON TelldusActionsPerformed.FK_TelldusAction_Id = TelldusActions.Id
WHERE TelldusUnits.Name IN ("Grovkök golvtermostat", "Huvudtermostat", "Uterum golvtermostat")
AND TelldusActionValueTypes.Name IN ("watt","temp")
GROUP BY TelldusUnits.Name, TelldusActionValues.ActionValue, TelldusActionValueTypes.Name
ORDER BY MAX(TelldusActionsPerformed.PerformedTime) DESC
Все еще есть деталь, о которой нужно позаботиться (согласно моему первоначальному вопросу: я только хотел, чтобы запрос возвращал абсолютно последние (по времени) уникальные комбинации для TelldusUnits.Name
TelldusActionValueTypes.Name
полей.
Ответ №1:
Вы правы, если вам нужно самое последнее время, вам нужно будет добавить предложение GROUP BY, не учитывающее TelldusActionsPerformed.Время выполнения. Пожалуйста, попробуйте этот скрипт
SELECT
--TelldusActionsPerformed.PerformedTime AS TelldusActionsPerformed_PerformedTime,
MAX(TelldusActionsPerformed.PerformedTime) AS TelldusActionsPerformed_PerformedTime,
TelldusUnits.Name AS TelldusUnits_Name,
TelldusActionValues.ActionValue AS TelldusActionValues_ActionValue,
TelldusActionValueTypes.Name AS TelldusActionValueTypes_Name
FROM
TelldusActions
INNER JOIN TelldusUnits ON TelldusActions.FK_TelldusUnit_Id = TelldusUnits.Id
INNER JOIN TelldusActionTypes ON TelldusActions.FK_TelldusActionType_Id = TelldusActionTypes.Id
INNER JOIN TelldusActionValues ON TelldusActions.FK_TelldusActionValue_Id = TelldusActionValues.Id
INNER JOIN TelldusActionValueTypes ON TelldusActionValues.FK_TelldusActionValueType_Id = TelldusActionValueTypes.Id
INNER JOIN TelldusActionsPerformed ON TelldusActionsPerformed.FK_TelldusAction_Id = TelldusActions.Id
WHERE TelldusUnits.Name IN ("Grovkök golvtermostat", "Huvudtermostat", "Uterum golvtermostat")
AND TelldusActionValueTypes.Name IN ("watt","temp")
GROUP BY TelldusUnits.Name,TelldusActionValues.ActionValue,TelldusActionValueTypes.Name
ORDER BY TelldusActionsPerformed.PerformedTime DESC
Комментарии:
1. Спасибо за вашу помощь. Я получаю странное (?) поведение с
ORDER BY
предложением. Похоже, это не учитывается?2. О, конечно, я забыл добавить MAX в конце… ПОРЯДОК По МАКСИМУМУ(telldusactionsисполнен. Выполняется время) DESC, это должно сработать, приветствия
Ответ №2:
Рабочий ответ
Мне действительно помог ответ Мурильо, хотя он не полностью ответил на мой вопрос (я все еще считаю, что это хороший ответ). Это запрос, который я, наконец, использовал и (надеюсь) отвечает на мой первоначальный вопрос:
SELECT
OrderedResultSet.TelldusActionsPerformed_PerformedTime,
OrderedResultSet.TelldusUnits_Name,
OrderedResultSet.TelldusActionValues_ActionValue,
OrderedResultSet.TelldusActionValueTypes_Name
FROM (
SELECT
FROM_UNIXTIME(MAX(TelldusActionsPerformed.PerformedTime)) AS TelldusActionsPerformed_PerformedTime,
TelldusUnits.Name AS TelldusUnits_Name,
TelldusActionValues.ActionValue AS TelldusActionValues_ActionValue,
TelldusActionValueTypes.Name AS TelldusActionValueTypes_Name
FROM
TelldusActions
INNER JOIN TelldusUnits ON TelldusActions.FK_TelldusUnit_Id = TelldusUnits.Id
INNER JOIN TelldusActionTypes ON TelldusActions.FK_TelldusActionType_Id = TelldusActionTypes.Id
INNER JOIN TelldusActionValues ON TelldusActions.FK_TelldusActionValue_Id = TelldusActionValues.Id
INNER JOIN TelldusActionValueTypes ON TelldusActionValues.FK_TelldusActionValueType_Id = TelldusActionValueTypes.Id
INNER JOIN TelldusActionsPerformed ON TelldusActionsPerformed.FK_TelldusAction_Id = TelldusActions.Id
WHERE TelldusUnits.Name IN ("Grovkök golvtermostat", "Huvudtermostat", "Uterum golvtermostat")
AND TelldusActionValueTypes.Name IN ("watt","temp")
GROUP BY TelldusUnits.Name, TelldusActionValues.ActionValue, TelldusActionValueTypes.Name
ORDER BY MAX(TelldusActionsPerformed.PerformedTime) DESC
) as OrderedResultSet
GROUP BY OrderedResultSet.TelldusUnits_Name, OrderedResultSet.TelldusActionValueTypes_Name