mysql - 为每个用户从表中获取最后 5 行
问题描述
我需要你帮忙解决这个问题。
设想:
用户可以投票任意数量的歌曲,但我只想选择每个用户的最后 5 票。我不想选择最后 5 票。
表结构:
例子:
3 个用户
- 卡尔,投了 10 首歌
- 罗伯特,投了 6 首歌
- 乔安妮,投了 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
解决方案
假设“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
);
推荐阅读
- python - numpy.linalg.inv() 的矩阵逆问题
- python - 使用 Python 从 MySQL 数据库中选择数据时使用“%s”附近错误的正确语法
- php - PHP 中带有对象数组的两个 ForEach 循环
- kotlin - 在 Kotlin 中向父类的方法中添加一些命令
- javascript - Javascript嵌套函数未定义
- django - 'put_object() 只接受关键字参数。'
- spring - Spring MVC 安装
- python - 使用 API Django Rest Framework 创建用户
- python - 使用找到我自己的模块的 dask 设置 PBS 集群时遇到问题
- c++ - (Windows C++) 如何在 FPS 游戏中模拟鼠标移动?