我已经阅读了这些示例,但无法让它适用于我的示例。
我有一个表'玩家',其中列'pid'和'name'以及一个表'card',列'pid','points'。
玩家记录有多张卡片记录。
如何查询每位玩家的前5名记录?
此查询返回我需要的内容,但不限制每个名称5个记录。
SELECT p.pid, p.name, c.points as lp
FROM player as p, card as c
WHERE p.pid=c.pid
ORDER BY p.name, lp DESC
答案 0 :(得分:2)
您可以使用变量为每个用户分配排名:
select pid, name, lp
from
(
SELECT pid,
name,
points as lp,
@prev := @curr,
@curr := name,
@rank := IF(@prev = @curr, @rank+1, 1) AS rank
FROM
(
select p.pid, name, points
FROM player as p
INNER JOIN card as c
ON p.pid=c.pid
) src, (SELECT @curr := null, @prev := null, @rank := 1) r
ORDER BY name, points desc
) src
where rank <= 5
order by name, lp DESC;
答案 1 :(得分:1)
MySQL不支持返回指定结果集所需的“分析”类型函数。我们可以通过使用MySQL“用户变量”来模拟该函数。
SELECT IF(@prev_name = p.name,@n:=@n+1,@n:=1) AS seq
, @prev_name := p.name AS name
, c.points as lp
FROM player as p
JOIN card as c
ON c.pid = p.pid
JOIN (SELECT @n := 0, @prev_name := NULL) i
HAVING seq <= 5
ORDER BY p.name, lp DESC
请注意,此语句的结果集与原始语句不同,因为它返回一个额外的列“seq”。此列将返回1,2,3等值。指示这是否是特定p.name的“第一”,“第二”,“第三”等行。
用于派生它的表达式基本上是检查当前行上p.name的值是否与前一行的值匹配。如果匹配,我们添加1;如果它不匹配,那么我们重置为零。
查询实际上会为每个p.name生成所有行的结果集。 HAVING
子句将限制实际返回给客户端的行。