选择具有最大值的行的 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.10
。 partition by
和 row_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的主要内容,如果未能解决你的问题,请参考以下文章