2016-12-06 47 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:/ –

相關問題