15. august 2010 - 10:52Der er
7 kommentarer og 1 løsning
Summere flere resultater
Hej
Er lidt i tvivl om jeg skal poste her eller under PHP - men antager det er her. Jeg sidder og laver lidt frivilligt arbejde med et point system til noget skoleatletik. Jeg er på INGEN måde en haj til at skrive sql-kald, så jeg håber på en venlig sjæl...
Jeg har to tabeller med bl.a. følgende felter:
DELTAGER id fornavn efternavn skole klasse koen
RESULTAT uid (fortløbende) did (referer til deltager.id) point cat
Jeg skal nu havde lavet en rangliste over bedste klasser ud fra point (kommer længere nede). Klasserne kan findes ved at se på eleverne i deltager-tabellen. MEN en klassse er både defineret ved felterne skole og klasse (der kan godt være flere elever der går i 6A, men er det på forskellgie skoler, er det jo forskellige klasser. klasserne på de enkelte skoler hedder ikke nødvendigvis det samme).
Klassens pointtal skal beregnes som: De 5 bedste (målt på resultat.point) drenge (deltager.koen = M) i hver resultat.cat (som der er 3 af) PLUS De 5 bedste (målt på resultat.point) piger (deltager.koen = K) i hver resultat.cat (som der er 3 af)
Altså består en klassens pointtal af 30 elev resultater der skal summeres. Ønsket er så en rangliste over klasserne.
Skal det være som 1 opslag? Eller må køn deles op? Flg. er for M:
"SELECT deltager.klasse AS dklasse,deltager.skole AS dskole, IN("SELECT SUM(resultat.point) FROM deltager INNER JOIN resultat ON deltager.id=resultat.did WHERE deltager.klasse = dklasse AND deltager.skole = dskole ORDER BY resultat.point DESC LIMIT 5") AS rpoint FROM deltager WHERE deltager.koen = 'M' GROUP BY deltager.skole,deltager.klasse"
Det kan sikkert gøres simplere, og jeg har ingen idé om det vil fungere...
Nej det behøves nok ikke at være i 1 opslag - hvis det efterfølgende output på php-siden kan slå det sammen. Det kan jeg ikke gennemskue om man kan med det du skriver....(?)
Jeg vil klart anbefale et opslag. Udemiddelbart ser ggxdg´s første SELECT ikke helt dum ud. Men det afhænger naturligvis af MySQL version om den virker.
Har du prøvet den første ide, og hvilket output giver den dig?
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'IN('SELECT SUM(resultat.point) FROM deltager INNER JOIN resultat ' at line 2
Jeg fik derefter en kammerat til at kigge på det også, og han kom op med følgende, som jeg naturligvis deler med jer her.
Men tak til ggxdg for at lede os på sporet - smid et svar hvis du vil havde pointene
Koden (til php) blev: // Henter alle klasserne ud af DB'en $query = mysql_query('SELECT del.skole, del.klasse FROM deltager del WHERE 1 GROUP BY del.skole, del.klasse');
// Opretter et array med alle de forskellige kategorier $catArr = array('K', 'L', 'S');
$i =0; // Looper over klasserne, for at finde deres point while ($KlasseRow = mysql_fetch_array( $query )) { $i ++; $ResArray[$i]['point'] = 0; // Looper over kategorierne foreach ($catArr as $key ) { // Den klasse og skole vi arbejder med $skole= $KlasseRow['skole']; $klasse= $KlasseRow['klasse'];
// Henter klassens fem bedste drenges score ud $ResQuery = mysql_query(" SELECT sum.skole, sum.klasse, SUM(sum.point) as point FROM ( SELECT d.skole, d.klasse, d.fornavn, d.efternavn, r.cat, r.point FROM deltager d, resultat r WHERE d.id=r.did AND d.klasse= '$klasse' AND d.skole= '$skole' AND d.koen = 'M' AND r.cat = '$key' ORDER by r.point DESC LIMIT 5 ) sum WHERE 1 GROUP BY sum.skole ");
// Resultatet af SQL'en ind i temp arrayet $tempDreng = mysql_fetch_array( $ResQuery );
// Henter klassens fem bedste pigers score ud $ResQuery = mysql_query(" SELECT sum.skole, sum.klasse, SUM(sum.point) as point FROM ( SELECT d.skole, d.klasse, d.fornavn, d.efternavn, r.cat, r.point FROM deltager d, resultat r WHERE d.id=r.did AND d.klasse= '$klasse' AND d.skole= '$skole' AND d.koen = 'K' AND r.cat = '$key' ORDER by r.point DESC LIMIT 5 ) sum WHERE 1 GROUP BY sum.skole ");
// Resultatet af SQL'en ind i temp arrayet $tempPige = mysql_fetch_array( $ResQuery );
// Resultaterne sættes ind i array $ResArray[$i]['skole'] = $tempDreng['skole']; $ResArray[$i]['klasse'] = $tempDreng['klasse']; $ResArray[$i]['point'] += ($tempDreng['point'] + $tempPige['point']);
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.