我想知道如何计算我正在运行的刺客游戏的排名,我希望首先按击杀次数对人进行排名,然后按击杀时间对人进行排序(那些在其他人之前被击杀的人排名更高),最后是那些已经被暗杀的人,排名低于活着的人。
我的暗杀记录表是这样的:
mysql> describe assassinations;
+-----------+-----------------------------------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-----------+-----------------------------------------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| assassin | int(11) | NO | | NULL | |
| target | int(11) | NO | | NULL | |
| timestamp | int(11) | NO | | NULL | |
| ver | enum('assassin','target','both','none') | NO | | none | |
| confirmed | bit(1) | NO | | b'0' | |
+-----------+-----------------------------------------+------+-----+---------+----------------+
我在想,必须有一种方法来排序mysql结果,就像我希望它排名的方式一样,但我不知道如何排序。我甚至试图获得最常见的assassin值:(。我将PHP与MySQL一起使用,因此PHP解决方案也可以工作。(请注意,忽略"confirmed"字段,但"ver"必须同时存在才能成为有效的kill)。
如有任何帮助,我们将不胜感激
使用COUNT
和MIN
来获取击杀次数和第一次击杀的时间。还有一个EXISTS
子查询,用来判断刺客是否已经被杀。然后,您可以在ORDER BY
子句中使用所有这些值来对玩家进行排名。
SELECT a1.assassin, COUNT(*) AS kills, MIN(timestamp) AS killtime,
EXISTS (SELECT * FROM assassinations AS a2
WHERE a2.target = a1.assassin) AS killed
FROM assassins AS a1
WHERE ver = 'both'
GROUP BY assassin
ORDER BY kills DESC, killtime ASC, killed ASC