I know what you need; I was just hoping to see some further attempts to "complete it"; you already have the complex part.
records.challengeid<->challenges.id....records.playerid<->player.id.
select r2.score, p.name, c.name from
( select r.recordID, max(r.date) AS maxDate
from records AS r
inner join
( select challengeID, min(score) AS minScore from records group by challengeID ) as t2 on ( t2.challengeID = r.challengeID AND t2.minScore = r.score )
group by r. challengeID ) as r1
inner join records as r2 on ( r2.recordID = r1.recordID and r2.date = r1.maxDate )
inner join players as p on ( p.id = r2.playerid )
inner join challenges as c on ( c.id = r2.challengeid )