Rij vergelijken met gerelateerde rijen uit dezelfde tabel
Bo Ter Ham
09/02/2016 18:17:59Hallo,
Ik heb in mijn database een tabel 'score', hierin sla ik per wedstrijd, per speler statistieken op over de betreffende speler, bijvoorbeeld hoeveel goals hij heeft gemaakt, het aantal assists en het aantal (succesvolle) passes. Nu wil ik graag een lijst hebben van spelers die de beste statistieken hebben t.o.v. andere spelers die op dezelfde positie spelen. Er zit nog wel een kleine subtiliteit in: ik wil alleen spelers vergelijken die tegen elkaar hebben gespeeld. Ik kom uit op de volgende query:
Deze query werkt wel, het probleem is alleen dat de query enorm traag is (+/- 10 seconde). Ik denk dus dat er een betere oplossing is, ik zou alleen niet weten hoe..
Iemand die weet hoe ik dit beter kan doen?
Bij voorbaat dank voor alle hulp
Ik heb in mijn database een tabel 'score', hierin sla ik per wedstrijd, per speler statistieken op over de betreffende speler, bijvoorbeeld hoeveel goals hij heeft gemaakt, het aantal assists en het aantal (succesvolle) passes. Nu wil ik graag een lijst hebben van spelers die de beste statistieken hebben t.o.v. andere spelers die op dezelfde positie spelen. Er zit nog wel een kleine subtiliteit in: ik wil alleen spelers vergelijken die tegen elkaar hebben gespeeld. Ik kom uit op de volgende query:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
SELECT player.name, player.role, team.name as teamName,
ROUND(
AVG(passes)-
(
SELECT
AVG(passes)
FROM score opponent
WHERE opponent.game IN (SELECT game FROM score o_score WHERE o_score.player = score.player)
AND opponent.position = score.position
AND opponent.player <> score.player
)
) as passes_diff,
FROM player
INNER JOIN team ON team.id = player.team
INNER JOIN score ON score.player = player.name
WHERE team.league = ?
GROUP BY player.name
ORDER BY passes_diff DESC
LIMIT 15
ROUND(
AVG(passes)-
(
SELECT
AVG(passes)
FROM score opponent
WHERE opponent.game IN (SELECT game FROM score o_score WHERE o_score.player = score.player)
AND opponent.position = score.position
AND opponent.player <> score.player
)
) as passes_diff,
FROM player
INNER JOIN team ON team.id = player.team
INNER JOIN score ON score.player = player.name
WHERE team.league = ?
GROUP BY player.name
ORDER BY passes_diff DESC
LIMIT 15
Deze query werkt wel, het probleem is alleen dat de query enorm traag is (+/- 10 seconde). Ik denk dus dat er een betere oplossing is, ik zou alleen niet weten hoe..
Iemand die weet hoe ik dit beter kan doen?
Bij voorbaat dank voor alle hulp
Gewijzigd op 09/02/2016 18:19:23 door Bo Ter Ham
Er zijn nog geen reacties op dit bericht.