小心。您的 SQL 无效,即使 MySQL 可以配置为允许它。
这是functional dependence 的问题。 SELECT 列表术语必须是 functionally dependent 上的 GROUP BY 术语。
您选择了id,它在功能上不依赖于week(date)。换句话说,您的架构/逻辑不能保证每个week(date) 组最多有一个id 值。尝试选择 date 也是如此,也不能保证每周只解析一个值。
您的WHERE 子句也是一个问题。 % 可用作 LIKE 表达式中的模式,但不能与 = 运算符一起使用,并且未正确引用为文字。我会留下'CURRENT_USER_ID' 来代表你的价值,假设那是正确的类型。问题中未显示表定义。
原始查询的更正版本是:
SELECT week(`date`) AS the_week
, MIN(`weight`) AS min_weight
, MIN(`id`) AS min_id
FROM Table
WHERE id='CURRENT_USER_ID'
GROUP BY week(date)
ORDER BY the_week ASC
;
注意:以上使用SELECT列表中的聚合函数MIN。这些表达式在功能上取决于GROUP BY 术语。也可以使用AVG函数,像这样:
SELECT week(`date`) AS the_week
, AVG(`weight`) AS avg_weight
FROM Table
WHERE id='CURRENT_USER_ID'
GROUP BY week(date)
ORDER BY the_week ASC
;
在 MySQL 中,我们可以在 GROUP BY 术语中使用派生列名/别名。
SELECT week(`date`) AS the_week
, AVG(`weight`) AS avg_weight
FROM Table
WHERE id='CURRENT_USER_ID'
GROUP BY the_week
ORDER BY the_week ASC
;
这是一个开始。