大多数关系型数据库系统都是如此,
SELECT
子句在
GROUP BY
子句之后处理。这意味着您不能在
GROUP BY
中使用别名列(例如此示例中的
ts
)。
基本上有两种方法可以解决这个问题。两种方法都是正确的,但有些人出于各种原因更喜欢其中一种。
首先,您可以按原始表达式进行分组,而不是按别名进行分组。这会导致重复代码,因为您将在 SELECT
和 GROUP BY
子句中具有完全相同的表达式。
SELECT
FROM_UNIXTIME(unix_timestamp(time,'yyyy-mm-dd hh:mm:ss'),'yyyy-mm-dd hh:mm') as ts,
COUNT(*) as cnt
FROM toucher
GROUP BY FROM_UNIXTIME(unix_timestamp(time,'yyyy-mm-dd hh:mm:ss'),'yyyy-mm-dd hh:mm')
LIMIT 10;
第二种方法是在子查询中包装您的表达式和别名。这意味着您不必重复表达式,但将有两个嵌套的查询,这可能会影响性能。
SELECT
ts,
COUNT(*) as cnt
FROM
(SELECT
FROM_UNIXTIME(unix_timestamp(time,'yyyy-mm-dd hh:mm:ss'),'yyyy-mm-dd hh:mm') as ts,
FROM toucher) x
GROUP BY x.ts
LIMIT 10;
两者应该有相同的结果。在这种情况下,你应该使用哪一个取决于你的特定用途;或者也可能取决于个人偏好。
希望这可以帮到你。