Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/78.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 分组方式和顺序_Sql_Group By_Mariadb_Sql Order By - Fatal编程技术网

Sql 分组方式和顺序

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

我有一个非常简单的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
字段的绝对最新(时间)唯一组合:

我相信我需要
按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,它应该可以工作,您好