【问题标题】:MySQL inner join with MAX(Date) and Grouping [duplicate]MySQL内部连接与MAX(日期)和分组[重复]
【发布时间】: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 的行。

标签: mysql sql


【解决方案1】:
WITH cte AS (
    SELECT *, ROW_NUMBER() OVER (PARTITION BY EnrolmentId ORDER BY e.DateUpdated DESC) rn
    FROM child c 
    INNER JOIN enrolment e USING (EnrolmentId)
)
SELECT * 
FROM cte
WHERE rn = 1
ORDER BY Name;

当然,用明确的列列表替换星号(不明确的Id - 分配适当的别名)。

【讨论】:

  • 谢谢它完美的工作!!现在我需要学习如何使用 CTE,以便我可以重写系统中的所有其他查询。
  • @snowflakes74 您不必为此使用 CTE,重复问题的答案向您展示了至少六种不同的解决方案,其中一些比 Akina 展示的 CTE 更快(尽管,您也会在那里找到相同的解决方案)。
猜你喜欢
  • 1970-01-01
  • 2023-03-07
  • 2012-09-24
  • 2013-04-02
  • 2019-03-27
  • 2018-06-14
  • 2011-07-13
  • 2013-07-26
  • 1970-01-01
相关资源
最近更新 更多