【问题标题】:Select max values from a column grouped by a different column from 2 joined tables从 2 个连接表中按不同列分组的列中选择最大值
【发布时间】:2017-09-19 18:55:33
【问题描述】:

我有一个复杂的问题,我不太擅长 MYSQL。我希望有人可以帮助我。
我有 2 张桌子。这些表的 sn-p:

  1. Members_per_year

ID |会员ID | Business_year_ID | AS_ID
1……………………………………56…………………………………………………………………………………………………………………………56 ............12
10004....1..................................55........ ...12
10005....1..................................54........ ...11
10002....1..................................57 ...30
2……………………………………58…………………………………………………………………………………………………………58 .........40
3…………………………………………58…………………………………………………………………………………………………………………………………………………………58 ............27

  1. 年份

ID |业务年
54......2012-2013
55......2013-2014
56......2014-2015
57......2015-2016
58......2016-2017

我想要做的是合并 Members_per_year 上的两个表。 Business_year_ID 和 Year.ID 列。之后,我想按 Member_ID 对数据进行分组,所以我得到每个成员 1 行。问题是它应该是该成员具有最大 Business_year 的数据。我设法整理了一个查询,但它无法正常工作。查询是:

SELECT Member_ID, Business_year_ID, MAX(Year.Business_year), Year.ID AS YearID, AS_ID  
FROM Members_per_year  
INNER JOIN Year ON Members_per_year.Business_year_ID = Year.ID  
GROUP BY Member_ID

然后它返回:

会员ID | Business_year_ID | MAX(年.Business_year) |年份ID | AS_ID
1..................................56.................. ..........2015-2016..................56........12
2..................................58.................. ..........2016-2017..................................58........40
3..................................58....................... ..........2016-2017..................58........27

它返回正确的最大 Business_year,但关联的 Business_year_ID 和 YearID 不正确。基本上,它为 Business_year_ID 选择第一个值,为 Business_year 选择 MAX。不是 MAX(Business_year) 对应的 Business_year_ID。有人知道为什么会发生这种情况以及如何解决吗?

编辑:
我故意搜索 Business_year 而不是 Business_year_ID。这是一个预防措施,以防较高的 ID 与实际较高的营业年度不相等。

【问题讨论】:

  • 如果这些表达式未包含在GROUP BY 子句中,则 SELECT 列表中的非聚合表达式返回的值是不确定的。如果我们在 sql_mode 中包含ONLY_FULL_GROUP_BY,我们可以让 MySQL 抛出错误(类似于其他 RDBMS 的行为)。 YearID 列的返回值来自组中的 some 行。它不一定来自最大值为 BusinessYear 的行。)此处记录的行为:dev.mysql.com/doc/refman/5.7/en/group-by-handling.html
  • @spencer7593 是的,我认为类似的事情正在发生。它只选择最大值,而不是与最大值对应的行,这有点烦人。

标签: mysql greatest-n-per-group


【解决方案1】:

您需要一个子查询来获取每个成员的最大年份,然后将结果与原始表连接:

select b.*, c.*
from (
  select Member_ID, max(Business_year_ID) y
  from Members_per_year
  group by Member_ID) a
join Members_per_year b on a.Member_ID = b.Member_ID and a.y = b.Business_year_ID
join Year c on b.Business_year_ID = c.ID;

【讨论】:

  • 感谢您的回复。我在 PHPMyadmin 中试过你的提议,但它说查询不正确。我认为在 from 子句之后有一个括号有问题。错误是:“预期有一个表达式。(靠近()”。还有更多但可能与相同的错误有关。(第二个 SELECT、右括号和“a”有问题)。跨度>
  • 我看到您搜索了 MAX(Business_year_ID) 而我需要同一成员的 Year.Business_year 的最大值,所以我需要搜索联合表的 MAX。
猜你喜欢
  • 1970-01-01
  • 2020-08-21
  • 1970-01-01
  • 1970-01-01
  • 2018-10-10
  • 1970-01-01
  • 1970-01-01
  • 2019-10-22
  • 2015-07-17
相关资源
最近更新 更多