Sql 分组方式和顺序
我有一个非常简单的Maria DB用于家庭自动化。这是我的ER的精华:Sql 分组方式和顺序,sql,group-by,mariadb,sql-order-by,Sql,Group By,Mariadb,Sql Order By,我有一个非常简单的Maria DB用于家庭自动化。这是我的ER的精华: TelldusActionsPerformed是一个日志表。它用于跟踪在不同时间执行的非常不同的操作(如温度测量、车门关闭、电源开关打开等) 我使用以下查询获取感兴趣的数据: SELECT TelldusActionsPerformed.PerformedTime AS TelldusActionsPerformed_PerformedTime, TelldusUnits.Name AS TelldusUn
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
字段的绝对最新(时间)唯一组合:
我相信我需要按TelldusUnits.Name,TelldusActionValueTypes.Name进行分组才能得到唯一的组合?是否可以将我的搜索结果限制为仅使用SQL的TelldusUnits.Name
+TelldusActionValueTypes.Name
字段的最新唯一组合?怎么做
编辑1:
如果我开箱即用地运行Murillo先生的脚本(我只是从_UNIXTIME()添加的,在我的原始问题中忘记了):
我得到以下结果集:
TelldusActionsPerformed.PerformedTime DESC的订单让我感到困惑。该表似乎不是根据PerformedTime
排序的后代?
(PerformedTime
,UNIX时间戳的数据类型为int(11))
编辑2:
关于Murillo先生通信的下一次更新给了我一个更好的分类:
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
字段的唯一组合。没错,如果需要最新时间,则需要添加不考虑TelldusActionsPerformed.PerformedTime的GROUP BY子句。请尝试此脚本
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
没错,如果想要最新时间,则需要添加一个不考虑TelldusActionsPerformed.PerformedTime的GROUPBY子句。请尝试此脚本
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
工作答案
尽管Murillos没有回答我的问题(我仍然认为这是一个很好的答案),但我确实得到了帮助。这是我最后使用的问题,并且(希望)回答我最初的问题:
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
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
这为我提供了最佳结果(最新时间):
有效答案
尽管Murillos没有回答我的问题(我仍然认为这是一个很好的答案),但我确实得到了帮助。这是我最后使用的问题,并且(希望)回答我最初的问题:
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
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
这为我提供了最佳结果(最新时间):
谢谢你的帮助。我在ORDER BY
子句中得到一个奇怪的(?)行为。它似乎没有被考虑?哦,当然,我忘了在末尾添加MAX…ORDER BY MAX(TelldusActionsPerformed.PerformedTime)描述,它应该可以工作,欢迎你的帮助。我得到一个奇怪的(?)使用ORDER BY
子句的行为。它似乎没有被考虑?哦,当然,我忘了在末尾添加MAX…ORDER BY MAX(TelldusActionsPerformed.PerformedTime)DESC,它应该可以工作,您好