Goedendag,
Aan de titel te zien lijkt het misschien makkelijk maar dat is het niet echt..
Ik probeer een tabel op mijn webpagina te plaatsen met het aantal punten van een groep spelers, een clan.

Ik heb totnutoe deze code en deze laat mooi alle gegevens zien uit de tabel met het aantal punten per clan, maar nu wil ik graag dat de clan met de meeste punten bovenaan komt te staan.

Hier de code totnutoe

<?php
$sql1 = "SELECT clan_naam,clan_id FROM clan";
$res1 = mysql_query($sql1);

echo "<table border='1' style='text-align:center'>";
echo "<tr><td width='150'>Clan naam</td><td width='150'>Score</td></tr>";

while($row = mysql_fetch_object($res1) )
{
	$clan_id = $row->clan_id;
	
	$sql2 = "SELECT user_id FROM clanleden WHERE clan_id = '$clan_id' ";
	$res2 = mysql_query($sql2);
	
	while($row2 = mysql_fetch_object($res2) )
	{
		$sql3 = "SELECT totaal_verdediging,totaal_aanval FROM user WHERE user_id = '$row2->user_id'";
		$res3 = mysql_query($sql3);
		
		$row3 = mysql_fetch_object($res3);
		$totaal_aanval += $row3->totaal_aanval;
		$totaal_verdediging += $row3->totaal_verdediging;
	}
	
	echo "<tr><td>" . $row->clan_naam . "</td><td>" . ($totaal_aanval + $totaal_verdediging) . "</td></tr>";
}

echo "</table>";
?>


Iemand een idee om dit makkelijk te veranderen in een lijstje met de clans op volgorde van aantal punten?

Alvast bedankt.
Jan Koehoorn schreef op 14.07.2008 22:48
Waarom heb je de tabel 'clanleden' nodig? Je hebt clans en users. Een veld clan_id in de tabel users zou toch voldoende zijn?

Ja dat zou in principe ook kunnen, maar ik dacht dat dit opsplitsten ook een deel was om je tabel te 'optimaliseren' anders staan de velden clan_id en clan_type in de usertabel terwijl deze niet gebruikt wordt als de user niet in een clan zit.

Maar is dit een probleem om op te lossen met INNER JOIN?
Als een user niet in een clan zit kun je het veld clan_id gewoon leeg laten toch?

SELECT
  c.clan_naam,
  SUM(u.totaal_aanval + u.totaal_verdediging)  AS totaal_punten
FROM
  clan AS c
INNER JOIN
  clanleden AS cl
    ON cl.clan_id = c.clan_id
INNER JOIN
  users AS u
    ON u.user_id = cl.user_id
GROUP BY
  c.clan_naam
ORDER BY
  totaal_punten DESC

Zoiets?

ps. De koppeltabel vind ik nog niet eens zo'n gek idee. Ik kan me prima voorstellen dat een bepaalde user in meerder clans kan zitten?
Jan Koehoorn, ja dat zou kunnen, maar betekent dit nou dat ik dat optimaliseren van de database niet goed snap, want daardoor heb ik dit veranderd?

Blanche, ik ga je code eens proberen. Alvast onwijs bedankt voor de hulp!
Die koppeltabel 'clanleden' heb je alleen nodig als een gebruiker bij meerdere clans kan horen. Als dat niet het geval is, kun je het id van de clan waartoe een gebruiker behoort gewoon in de users tabel opslaan, samen met eventueel het type.

Behoort een gebruiker tot geen enkele clan, dan zijn die velden gewoon leeg...
Ja ok dan.
Ok dus je zou alleen je tabel hoeven/moeten optimaliseren en te splitsen als het een 1 op meer relatie zou zijn?
In jouw situatie heb je in ieder geval een 1-op-meer relatie, namlijk die tussen een clan en zijn leden. Vandaar ook dat je een aparte tabel voor de clans gebruikt en enkel het id aan een gebruiker koppelt.

Zodra daarnaast gebruikers ook nog eens lid kunnen zijn van meerdere clans, heb je een meer-op-meer relatie. In zo'n situatie heb je altijd een koppeltabel (clanleden in jouw geval) nodig...
Bij een 1 op veel relatie heb je twee tabellen nodig. Bij een veel op veel relatie een koppeltabel.
Ja ok dan snap ik dat nu :)

Maar nu is het alleen nog dat ik die (voor mij) erg moeilijke mysql query niet snap.
En daardoor kan ik nu niet de fout oplossen die er nu op mijn beeldscherm komt :(


<?php
echo "<table border='1'>";
$sql = "SELECT
  			c.clan_naam,
  			SUM(u.totaal_aanval + u.totaal_verdediging)  AS totaal_punten
		FROM
  			clan AS c
		INNER JOIN
		  	clanleden AS cl
			ON cl.clan_id = c.clan_id
		INNER JOIN
		  users AS u
			ON u.user_id = cl.user_id
		GROUP BY
		  c.clan_naam
		ORDER BY
		  totaal_punten DESC";
$res = mysql_query($sql);
while($row = mysql_fetch_object($res) )
{
	echo "<tr><td>" . $row->c.clan_naam . "</td><td>" . $row->totaal_punten . "</td></tr>";
}

echo "</table>";
?>


Warning: mysql_fetch_object(): supplied argument is not a valid MySQL result resource in C:\wamp\www\Klikker\clan_ranklijst.php on line 61

regel 61 is de regel met de while($row =mysql_fetch_object($res) )
Je query is waarschijnlijk mislukt, alleen controleer jij dat nergens. Doe dat dus eerst eens en geef een foutmelding met mysql_error() als de query inderdaad mislukt is. Aan die foutmelding heb je namelijk veel meer.

SQL Beginnershandleiding

In deze tutorial staan genoeg voorbeeldjes met foutafhandeling.

Reageren