【发布时间】:2022-01-18 14:10:30
【问题描述】:
我有一个 MySQL 数据库 8.0,其结构如下:
Table1: Child
Id | Name | EnrolmentId
1 | Nathan | 12345ABC
2 | James | 56789BCD
Table2 : Enrolments
Id | EnrolmentId |StartDate | Status | DateUpdated
1 | 12345ABC |2021-12-01| PENDING | 2021-06-08T02:13:24
2 | 12345ABC |2021-12-01| CONFIRM | 2021-12-15T04:56:45
3 | 56789BCD |2021-12-02| CREATED | 2021-06-09T02:13:24
4 | 56789BCD |2021-12-02| CONFIRM | 2021-12-16T04:56:45
我只想显示每个注册的 1 行及其最新注册状态。
EnrolmentID | Name | StartDate | Status | DateUpDated
12345ABC | Nathan |2021-12-01 | CONFIRM | 2021-12-15T04:56:45
56789BCD | James |2021-12-02 | CONFIRM | 2021-12-16T04:56:45
我正在使用以下查询:
SELECT e.enrolmentId,c.Name,e.startDate, e.Status,e.DateUpdated
FROM child c INNER JOIN enrolment e ON c.EnrolmentId = e.enrolmentid
GROUP BY e.enrolmentid ORDER BY c.Name;
它工作正常,但因为我的数据库在 Azure MySQL 8.0xx 中,并且根据其他建议,我已将 sql_mode 的服务器参数设置为 full_group_by 为 off,但在重新启动 MySQL 服务器之前我仍然随机出现此错误。以下是我得到的错误。
"Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggregated column
'mydatbase.c.Name' which is not functionally dependent on columns in GROUP BY clause;this is incompatible with sql_mode=only_full_group_by
有什么方法可以重写它,使它对 MySQL 8.0 友好。
【问题讨论】:
-
获取非聚合列的规则是什么,数据库选择的任何值都可以吗?如果是这种情况,你可以试试ANY_VALUE
-
@ProGu 谢谢我已经尝试过 ANY_VALUE 但它是 MySQL 分配的随机值,因此存在风险。我需要最新的记录 (DateUpdated),因为它将具有最新状态
-
我有一个 MySQL 数据库 8.0,其结构如下所示 将其提供为 CREATE TABLE + INSERT INTO,而不是作为表。 有什么方法可以重写它,以便使它对 MySQL 8.0 友好。 CTE 中的 ROW_NUMBER() 并仅选择 rn=1 的行。