我正在尝试从我的表格中检索“克星”列表。
表格播放器:
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);
我想要检索的内容:
我能得到的最近的请求:
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 :(得分: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