首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从表中为每个用户获取最后5行

从表中为每个用户获取最后5行
EN

Stack Overflow用户
提问于 2018-06-06 15:35:01
回答 2查看 126关注 0票数 1

我需要你帮我解决这个问题。

场景:

用户可以投票任何数量的歌曲,但我只想选择最后5票每用户。我不想选最后5票。

表结构:

示例:

3个用户

  • 卡尔,投了10首歌
  • 罗伯特,投了6首歌
  • 乔安妮,选了三首歌

我想得到卡尔最后5票,罗伯茨最后5票和乔尼斯3票。

当前的SQL查询:

代码语言:javascript
复制
SELECT songs.genre, songs.title, songs.band, COUNT(*) AS anzahlVotes, users.name
FROM T_Songs AS songs
RIGHT JOIN T_Votes AS votes ON songs.P_Song_id = votes.F_Song_id
LEFT JOIN T_Users AS users ON votes.F_User_id = users.P_User_id
WHERE votes.P_Vote_id IN (
    SELECT P_Vote_id
    FROM T_Votes
    GROUP BY F_User_id
    HAVING P_Vote_id > MAX(P_Vote_id)-5

);

但是这个查询没有返回正确的选票计数。

解决方案(感谢戈登·林诺夫和保罗·斯皮格尔)

代码语言:javascript
复制
SELECT songs.genre, songs.title, songs.band, COUNT(*) AS anzahlVotes, users.name
FROM T_Songs AS songs
RIGHT JOIN T_Votes AS votes ON songs.P_Song_id = votes.F_Song_id
LEFT JOIN T_Users AS users ON votes.F_User_id = users.P_User_id
WHERE users.nobility_house IS NOT NULL
AND votes.P_Vote_id >= coalesce(
(select votes2.P_Vote_id
from T_Votes votes2
where votes2.F_User_id = votes.F_User_id
order by votes2.P_Vote_id desc
limit 1 offset 4
), 0)
GROUP BY votes.F_User_id
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-06-06 15:40:27

假设“最后5”意味着ids最高的五个,您可以这样做:

代码语言:javascript
复制
select v.*
from t_votes v
where v.p_vote_id >= (select v2.p_vote_id
                      from t_votes v2
                      where v2.f_user_id = v.f_user_id
                      order by v2.p_vote_id desc
                      limit 1 offset 4
                     );

我会让你知道如何从其他表中引入列。

编辑:

如果少于5行:

代码语言:javascript
复制
select v.*
from t_votes v
where v.p_vote_id >= coalesce( (select v2.p_vote_id
                                from t_votes v2
                                where v2.f_user_id = v.f_user_id
                                order by v2.p_vote_id desc
                                limit 1 offset 4
                               ), p_vote_id
                             );
票数 1
EN

Stack Overflow用户

发布于 2018-06-06 15:46:11

您可以在同一表上使用联接进行筛选:

代码语言:javascript
复制
SELECT songs.genre, songs.title, songs.band, COUNT(*) AS anzahlVotes, users.name
    FROM T_Songs AS songs
    RIGHT JOIN T_Votes AS votes ON songs.P_Song_id = votes.F_Song_id
    LEFT JOIN T_Users AS users ON votes.F_User_id = users.P_User_id        
LEFT JOIN (
    SELECT F_User_id, Max(P_Vote_id)-5 as MaxVoteId
    FROM T_Votes
    GROUP BY F_User_id
    ) DF ON ((DF.F_User_id = votes.F_User_id) AND (P_Vote_id >= MaxVoteId));
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50724309

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档