选择具有最大值的行的 ID

Posted

技术标签:

【中文标题】选择具有最大值的行的 ID【英文标题】:Select ID of a row with max value 【发布时间】:2021-08-10 19:58:46 【问题描述】:

如何在连接多个表的查询中选择具有另一列最大值的行的 ID?

例如,假设我有三张桌子。 tblAccount 存储一组用户,就像一个家庭。 tblUser 存储用户,每个用户都绑定到来自 tblAccount 的记录。每个用户都可以成为计划的一部分,存储在tblPlans。每个计划都有一个Rank 列,用于在比较计划级别时确定它的排序。例如,Lite 低于 Premium。所以想法是每个用户都可以有一个单独的计划,例如高级版、基本版、精简版等...,但父帐户没有计划。

如何通过一次查询确定账户中的最高计划?

tblAccount

PKID Name
1 Adams Family
2 Cool Family

tblUsers

PKID Name AccountID PlanID
1 Bob 1 3
2 Phil 2 2
3 Suzie 2 1

tblPlans

PKID Name Rank
1 Premium 3
2 Basic 2
3 Elite 4
4 Lite 1

这是我希望产生的结果:

AccountID Name HighestPlanID PlanName
2 Adams Family 1 Premium

我试过了:

SELECT U.AccountID, A.Name, MAX(P.Rank) AS Rank, P.PKID as HighestPlanID, P.Name as PlanName
FROM tblPlans P
INNER JOIN tblUsers U ON U.PlanID = P.PKID
INNER JOIN tblAccounts A ON U.AccountID = A.PKID
WHERE U.AccountID = 2

并且查询并不总是有效,选择 Rank 的 MAX 不会从 tblPlans 中选择整行的值。

我正在寻找与mysql-5.6.10兼容的解决方案

【问题讨论】:

@bill-karwin - 在查看Retrieving the last record in each group - MySQL 之后,我相信我的问题有点不同,因为它涉及多个表。链接问题中的答案解释了在同一张桌子上加入,我不能在这里做 我已经重新提出了这个问题,但我建议即使对于连接表,该技术也是相同的。关注greatest-n-per-group标签,这种一般类型的问题已经被问过很多次了,毫无疑问有一个涉及联表的案例。 【参考方案1】:

您可以加入表格并使用ROW_NUMBER() 来标识您想要的行。然后过滤很容易。

例如:

select *
from (
  select a.*, p.*,
    row_number() over(partition by a.pkid order by p.rank desc) as rn
  from tblaccount a
  join tblusers u on u.accountid = a.pkid
  join tblplans p on p.pkid = u.planid
) x
where rn = 1

在子查询中,您可以添加 where u.accountid = 2 来检索感兴趣的单个帐户,而不是所有帐户。

【讨论】:

啊拍摄 - 我应该提到我正在使用mysql-5.6.10partition byrow_number 不适用于我正在使用的版本 啊哈!我接受了您的回答并对其进行了轻微修改,这是您的功劳:D【参考方案2】:

在@the-impaler 的帮助下,我稍微修改了他们的答案,得出了非常相似的答案:

select *
from (
  select a.*, p.*
  from tblaccount a
  join tblusers u on u.accountid = a.pkid
  join tblplans p on p.pkid = u.planid
  where u.accountid = 2
  order by p.rank desc
) x limit 1

子查询按计划排名从上到下对每个用户进行排序,然后***查询选择最上面的行limit 1。它似乎有效!

【讨论】:

以上是关于选择具有最大值的行的 ID的主要内容,如果未能解决你的问题,请参考以下文章

如何选择每个项目具有最大时间戳的行集?

选择具有最大 ID 和特定条件的行

从表中选择具有最大日期的行

在根据最大列值理解行的同时查找具有最高值的行的列名

提取具有多个日期的行的最小最大日期

SQL:选择具有最大值的行并按单列分组