为“Order By”整数数据创建排名-MySQL

为“Order By”整数数据创建排名-MySQL,mysql,greatest-n-per-group,Mysql,Greatest N Per Group,我正在做一个项目,我有一些出勤数据。我希望能够打印出最优秀的与会者 我的查询设置为按每个人参加的活动列表排序。我允许用户设置一个限制,比如说前50名与会者。问题是,这对关系没有任何作用,所以我想在查询中生成一个排名,然后用它来限制 我的相关方案如下: 成员表: Member Name | Member ID | # Events Attended 事件表: Event Name | Event ID | Other Stuff 然后将此表用作考勤表的外键,该表通过使用组合成员和事件ID的外键

我正在做一个项目,我有一些出勤数据。我希望能够打印出最优秀的与会者

我的查询设置为按每个人参加的活动列表排序。我允许用户设置一个限制,比如说前50名与会者。问题是,这对关系没有任何作用,所以我想在查询中生成一个排名,然后用它来限制

我的相关方案如下:

成员表:

Member Name | Member ID | # Events Attended
事件表:

Event Name | Event ID | Other Stuff
然后将此表用作考勤表的外键,该表通过使用组合成员和事件ID的外键将成员链接到事件

出席人数表:

Attendance Log ID | Member FK | Event FK
因此,我的问题是:

SELECT  `Member Name`, `Member ID` , COUNT(  `Member ID` ) AS Attendances
FROM  `Members` m
INNER JOIN 
(SELECT *
 FROM  `Events` e
 INNER JOIN  `Attendance` r ON  `Event ID` =  `Event FK`
) er
ON  `Member ID` =  `Member FK`
GROUP BY  `Member ID`
ORDER BY `Attendances` DESC
所以,总而言之,我如何创建一个可以用来限制结果的排名?因此,前50名与会者是排名前50名的与会者,因此条目>=50,而不是50个人条目始终为50,会切断联系

谢谢大家

编辑1:

无限制查询的示例输出显示所有结果:

Member Name | Member ID | Attendances
Bob Saget               1                    5
John Doe                2                    4
Jane Doe                3                    3
Stack Overflow          4                    3
因此,当用户请求使用我的当前查询显示前3名与会者时, 他们将得到以下结果:

Member Name | Member ID | Attendances
Bob Saget               1                    5
John Doe                2                    4
Jane Doe                3                    3
在现实中,我希望它能展示领带和类似的东西

Rank | Member Name | Member ID | Attendances
1             Bob Saget              1               5
2             John Doe               2               4
3             Jane Doe               3               3
3             Stack Overflow         4               3
您可以尝试以下方法:-

SELECT IF(Attendances = @_last_Attendances, @curRank:=@curRank, @curRank:=@_sequence) AS rank, 
       @_sequence:=@_sequence+1,@_last_age:=age, Member Name, Member ID, 
       COUNT(  `Member ID` ) AS Attendances     
FROM `Members` m
INNER JOIN (SELECT * FROM  `Events` e
            INNER JOIN  `Attendance` r 
            ON  `Event ID` =  `Event FK`) er
ON  `Member ID` =  `Member FK`, 
(SELECT @curRank := 1, @_sequence:=1, @_last_Attendances:=0) r
GROUP BY  `Member Name`, `Member ID`, Rank
HAVING COUNT( `Member ID`) >= (SELECT MAX (`Member ID`) 
                               FROM `Members`
                               WHERE `Member ID` < (SELECT MAX (`Member ID`)  
                                                    FROM `Members`
                                                    WHERE `Member ID` < (SELECT MAX (`Member ID`)  
                                                                         FROM `Members`)))
    ORDER BY COUNT(`Member ID`) DESC;

我认为这种方法会对您有所帮助。

在两个查询中执行此操作将是您的最佳选择,否则查询将变得非常复杂

我们需要解决的第一个问题是如何确定正确的排名。我们可以通过执行select来实现这一点,但只返回作为新限制的秩的单个值。假设我们想要前3个列,我们将只返回第三行偏移量2,限制1

# Pre-select the lowest rank allowed.
SELECT COUNT(a.attendanceId) INTO @lowestRank
FROM  Member AS m
  JOIN Event AS e
  JOIN Attendance AS a USING (memberId, eventId)
GROUP BY m.memberId
ORDER BY 'Attendances' DESC
LIMIT 1 OFFSET 2;
一旦我们有了@lowestRank,我们现在可以再次运行查询,但需要一个HAVING子句来限制GROUP BY results。通过仅限制秩等于或大于@LowerStrank的结果,我们实际上为该字段增加了一个限制

# Return all rows of the lowest rank or above.
SELECT m.name, m.memberId, COUNT(a.attendanceId) AS 'Attendances'
FROM  Member AS m
  JOIN Event AS e
  JOIN Attendance AS a USING (memberId, eventId)
GROUP BY m.memberId
HAVING COUNT(a.attendanceId) >= @lowestRank
ORDER BY 'Attendances' DESC;
我们可以在一个查询中通过将第一个查询作为第二个查询的连接来实现这一点,但我不建议这样做,因为这会使查询复杂化,有潜在的性能影响,并且使单独更改查询变得更加困难


例如,第一个查询只在截止点上限制重复,但是如果您想把所有的副本都看作一个等级,那么我们可以改变这个查询,只考虑不同的行。在这个特定的数据集中,结果是相同的,但是如果我们有两个成员有四个出席率,那么我们仍然会得到三个不同的排名5,4,4,3,3,而上面的查询只得到两个不同的排名5,4,4.

Plz post样本数据和预期O/p.Ankit-添加了一个编辑,我认为如果我解释正确,应该可以提供您需要的信息。请原谅我的格式问题。想弄清楚,有一件事我有点不清楚。您希望所有重复计数都被视为一个等级,还是仅当我们达到“50”等级时,仍然包括任何其他相同等级的计数?我在PHPMyAdmin中运行了它,并得到一个错误:1054-未知列“字段列表”中的“出席次数”