2016-12-06 75 views
1

我试图从我的表中检索'nemesis'列表。MYSQL - 从一个组中检索最大计数kill(每个受害者一行)

表球员:

CREATE TABLE IF NOT EXISTS stats_players (
    idPlayerSteam BIGINT UNSIGNED PRIMARY KEY, 
    name VARCHAR(255)) 

表事件:

CREATE TABLE IF NOT EXISTS stats_events (
    idEvent INT UNSIGNED AUTO_INCREMENT PRIMARY KEY, 
    idPlayerSteam BIGINT UNSIGNED, 
    type VARCHAR(50), 
    dateOccurs DATETIME, 
    idPlayerSteamVictim BIGINT UNSIGNED) 

数据:

INSERT INTO stats_players (idPlayerSteam, name) VALUES 
(1,'bob'), (2,'tom'),(3,'robby'),(4,'dany'),(5,'john'); 

INSERT INTO stats_events (idPlayerSteam,type,dateOccurs,idPlayerSteamVictim) VALUES 
(1,'PVP','2016-05-05 12:12:12',3), 
(1,'PVP','2016-05-05 12:15:12',3), 
(1,'PVP','2016-05-05 12:16:12',3), 
(1,'PVP','2016-05-05 12:17:12',3), 
(2,'PVP','2016-05-05 13:12:12',3), 
(2,'PVP','2016-05-05 12:19:12',3), 
(2,'PVP','2016-05-05 12:20:12',3), 
(3,'PVP','2016-05-06 12:12:12',2), 
(3,'PVP','2016-05-06 12:12:12',1), 
(4,'PVP','2016-05-06 12:12:12',5), 
(4,'PVP','2016-05-06 12:12:12',5), 
(4,'PVP','2016-05-06 12:12:12',5); 

tables

我要找回什么:

  • 的一个对方球员
  • 的每个球员的“克星”的“克星”,我指的是与记录针对杀敌次数最多的对手玩家

what I want and what I get

最近的请求,我可以得到:

SELECT v.idPlayerSteam,v.name as victim,k.idPlayerSteam,k.name as killer, count(*) 
    FROM stats_players v 
    LEFT OUTER JOIN stats_events e ON v.idPlayerSteam = e.idPlayerSteamVictim 
    LEFT OUTER JOIN stats_players k ON e.idPlayerSteam = k.idPlayerSteam 
    WHERE e.type='PVP' 
    GROUP BY v.idPlayerSteam,k.idPlayerSteam 
    HAVING COUNT(*) > 2 
    ORDER BY v.idPlayerSteam, COUNT(*) DESC 

它几乎工程,但我可以得到每个受害者只有一行(在必杀计第一个)

我知道我可以使用子请求,但我想不出如何.. :(

+0

发表您的电流输出和期望的一个 – Rahul

+0

你在这里一半,但看到http://meta.stackoverflow.com/questions/333952/why-should-i-provide-an-mcve-for-what-seems-to-me-to-be-a-very -simple-sql-query – Strawberry

+0

另外,我认为你的问题应该是*“每个玩家的'克星',我的意思是对该玩家记录的杀人数最高的对手”* – Strawberry

回答

0

我已经创建了一个查询,我认为做你想要的。
这是一个丑陋的,可能没有优化,但它似乎工作。
它还显示杀手的ID和克星杀死受害者的次数。

SELECT sp.*, (
    SELECT idPlayerSteam FROM stats_events se WHERE se.idPlayerSteamVictim = sp.idPlayerSteam 
    GROUP BY idPlayerSteamVictim ORDER BY COUNT(*) DESC, dateOccurs DESC LIMIT 1 
) 'nemesis_id', 
(
    SELECT (SELECT name FROM stats_players spx WHERE spx.idPlayerSteam = se.idPlayerSteam) FROM stats_events se WHERE se.idPlayerSteamVictim = sp.idPlayerSteam 
    GROUP BY idPlayerSteamVictim ORDER BY COUNT(*) DESC, dateOccurs DESC LIMIT 1 
) 'nemesis_name',(
    SELECT COUNT(*) FROM stats_events se WHERE se.idPlayerSteamVictim = sp.idPlayerSteam AND idPlayerSteam = nemesis_id 
    GROUP BY idPlayerSteamVictim ORDER BY COUNT(*) DESC, dateOccurs DESC LIMIT 1 
) 'kills' FROM stats_players sp 

当某人是一个“ex-aequo nemesis”时,最新的杀死优先。
它采用了细分电子邮件子查询 - 这似乎在MySQL 5.7

这里工作是一个“小提琴”的链接,我用来测试它: http://rextester.com/JRK5385

+0

谢谢!这似乎工作正常。 –

+0

我很高兴它确实;) 最好的方式来说谢谢你将是一个投票和/或接受的答案;> – Ezenhis

+1

完成!我没有注意到“接受”:D但我仍然不能upvote:/ –

相关问题