Query om 2 groepen met allebei zelfde totaal te krijgen
Als ik 1 datum neem heb ik bijvoorbeeld 12 gebruikers met allemaal een score. Kan ik met een query deze 12 opdelen in 2 groepen met allebei een totale (ongeveer) zelfde score?
Ik hoef niet direct een kant en klare query/script maar wat kan ik in een query uitvoeren en wat vervolgens in php?
Ik kan selectie maken dat ik de gebruikers uit de tabel krijg op basis van datum, een totaal van de score van de gebruikers, maar dan...
Ik heb nu:
SELECT score FROM `scores` WHERE datum = '2013-01-11' AND RAND() <= 0.5 LIMIT 6
Gewijzigd op 13/01/2013 23:53:41 door Jochanan V
Stel:
- je hebt een referentie van het aantal punten. bv. 20 punten.
- Je hebt een vast aantal spelers nodig: 12
Die 20 kan je eventueel berekenen met gemiddelde waarden, via een eerder uitgevoerde query.
Dan selecteren we 12 spelers (LIMIT 12) en rangschikken ze volgens het verschil met 20.
Dit geheel staat in een subquery; de hoofdquery schudt die 12 door mekaar.
Dan kan je bij het fetchen ( while ($row = mysql_fetch_assoc($res)) ) speler 1->6 bij ploeg 1 zetten, de rest bij ploeg 2.
Ofwel met even/oneven werken
Dat kan zoiets worden
Code (php)
1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
SELECT *
FROM
(SELECT id, ploeg, punten, ABS(punten - 20) AS verschil
FROM klassement
WHERE datum = '2013-01-11'
ORDER BY verschil
LIMIT 12) AS t1
ORDER BY RAND()
FROM
(SELECT id, ploeg, punten, ABS(punten - 20) AS verschil
FROM klassement
WHERE datum = '2013-01-11'
ORDER BY verschil
LIMIT 12) AS t1
ORDER BY RAND()
Gewijzigd op 14/01/2013 14:47:33 door Kris Peeters
Code (php)
1
2
3
4
5
6
7
8
9
10
2
3
4
5
6
7
8
9
10
SELECT id, speler, score, 0 as sc_group
FROM scores
WHERE score >= (SELECT AVG(score) FROM scores WHERE datum = '2013-01-11')
AND datum = '2013-01-11'
UNION
SELECT id, speler, score, 1 as sc_group
FROM scores
WHERE score < (SELECT AVG(score) FROM scores WHERE datum = '2013-01-11')
AND datum = '2013-01-11'
ORDER BY sc_group, score DESC
FROM scores
WHERE score >= (SELECT AVG(score) FROM scores WHERE datum = '2013-01-11')
AND datum = '2013-01-11'
UNION
SELECT id, speler, score, 1 as sc_group
FROM scores
WHERE score < (SELECT AVG(score) FROM scores WHERE datum = '2013-01-11')
AND datum = '2013-01-11'
ORDER BY sc_group, score DESC
Edit:
Niet onbelangrijke ands vergeten
Niet onbelangrijke ands vergeten
Gewijzigd op 14/01/2013 17:17:08 door Ger van Steenderen