MYSQL - 从组中检索最大计数终止(每个受害者1行)

时间:2016-12-06 15:04:26

标签: mysql

我正在尝试从我的表格中检索“克星”列表。

表格播放器:

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

它几乎可以工作但我每个受害者只能获得一个行(杀人数中的第一个)

我知道我可以使用子请求,但我无法知道如何... :(

1 个答案:

答案 0 :(得分:0)

我已经创建了一个查询,我认为它可以满足您的需求。 这是一个丑陋的,可能没有优化,但似乎有效 它还显示了杀手的身份证以及克星杀死受害者的次数。

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

当有人是"前其他的克星"最新的杀戮优先 它使用分组子查询 - 这似乎适用于MySQL 5.7中 这是一个指向"小提琴"的链接。我以前经常测试它: http://rextester.com/JRK5385