首页 > 解决方案 > 为每个用户从表中获取最后 5 行

问题描述

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

设想:

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

表结构:

点击这里

例子:

3 个用户

我想让 Karls 最后 5 票,Roberts 最后 5 票,Joannes 3 票。

当前 SQL 查询:

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

);

但是这个查询不会返回正确的投票数。

解决方案(感谢 Gordon Linoff 和 Paul Spiegel)

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

标签: mysqlsql

解决方案


假设“last 5”表示 id 最高的五个,您可以这样做:

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 行:

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
                             );

推荐阅读