簡體   English   中英

MySQL限制組的記錄

[英]MySQL limit records for a group

我已經閱讀了這些示例,但無法讓它適用於我的示例。

我有一個表'玩家',列'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

您可以使用變量為每個用戶分配排名:

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;

請參閱SQL Fiddle with Demo

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子句將限制實際返回給客戶端的行。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM