这与我之前提出的问题密切相关。
我在帖子和位置之间存在多对多关系。
连接表称为PostLocations,除了FK 之外什么也没有。 (位置 ID、帖子 ID)
我正在尝试撤回每个位置的置顶帖子。
这是我的查询(在我上一个问题的答案中给出):
SELECT pl.LocationId, p.postid, p.UniqueUri, p.Content, MAX(s.BaseScore) as topscore
from dbo.PostLocations pl
inner join dbo.posts p on pl.PostId = p.PostId
inner join dbo.reviews r on p.postid = r.postid
inner join dbo.scores s on r.scoreid = s.scoreid
group by pl.locationid, p.postid, p.UniqueUri, p.Content
但问题是,因为 PostLocations 可能有这样的条目:
LocationId PostId
1 213213
2 498324
1 230943
所以我上面的查询返回 LocationId 1 两次,因为它在连接表中有两条记录。我只需要每个位置 1 条记录 - 每个位置 ID 的顶部帖子。
我也尝试过这个:
SELECT l.LocationId, p.postid, p.UniqueUri, p.Content, MAX(s.BaseScore) as topscore
from dbo.PostLocations pl
inner join dbo.Locations l on pl.LocationId = l.LocationId
inner join dbo.posts p on pl.PostId = p.PostId
inner join dbo.reviews r on p.postid = r.postid
inner join dbo.scores s on r.scoreid = s.scoreid
group by l.locationid, p.postid, p.UniqueUri, p.Content
相同的结果 - 这是返回的结果:
LocationId PostId UniqueUri Content TopScore
1 213213 some-post pew pew 2.00
2 498324 anot-post blah bl 4.50
1 230943 sadjsa-as asijd a 3.5
这是应该返回的内容:
LocationId PostId UniqueUri Content TopScore
1 230943 sadjsa-as asijd a 3.5
2 498324 anot-post blah bl 4.50
因为 LocationId 1 有 2 个帖子,但 PostId 230943 得分最高,所以这是返回的帖子。
对我缺少的东西有什么想法吗?
最佳答案
如果您使用的是 SQL Server 2005 或更高版本,您可以执行以下操作:
With RankedLocations As
(
Select PL.LocationId
, S.BaseScore
, P.PostID
, P.UniqueUri
, P.Content
, Row_Number() Over( Partition By PL.LocationId Order By S.BaseScore Desc ) As ScoreRank
From dbo.PostLocations As PL
Join dbo.Posts As P
On P.PostId = PL.PostId
Join dbo.Reviews As R
On R.PostId = P.PostId
Join dbo.Scores As S
On S.ScoreId = R.ScoreId
)
Select LocationId, BaseScore, PostID, UniqueUri, Content
From RankedLocations
Where ScoreRank = 1
关于T-SQL - 帮助进行多对多的 MAX 操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4495104/