Resultaten laten zien uit een MySQL tabel waarbij de grootste eerst
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
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
<?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>";
?>
$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.
Gewijzigd op 01/01/1970 01:00:00 door Dennis
echo "<table border='0'>"; ..
user_id = '$row2->user_id'"; ..
auwauw
Er is meer met je code mis dan alleen je probleem.
1. Naamgeving , minstens net zo belangrijk als inspringen voor een goed leesbare en vooral goed te debuggen code!
2. Enkel buiten , dubbel binnen. Pas je quotes overal daarop aan.
3. Alle vars BUITEN de quotes. GEEN UITZONDERINGEN!
SELECT .. FROM .. WHERE .. ORDER BY aantal_punten.
wes schreef op 14.07.2008 12:03:
$sql1 $sql2 $sql3 ..
echo "<table border='0'>"; ..
user_id = '$row2->user_id'"; ..
auwauw
Er is meer met je code mis dan alleen je probleem.
1. Naamgeving , minstens net zo belangrijk als inspringen voor een goed leesbare en vooral goed te debuggen code!
2. Enkel buiten , dubbel binnen. Pas je quotes overal daarop aan.
3. Alle vars BUITEN de quotes. GEEN UITZONDERINGEN!
echo "<table border='0'>"; ..
user_id = '$row2->user_id'"; ..
auwauw
Er is meer met je code mis dan alleen je probleem.
1. Naamgeving , minstens net zo belangrijk als inspringen voor een goed leesbare en vooral goed te debuggen code!
2. Enkel buiten , dubbel binnen. Pas je quotes overal daarop aan.
3. Alle vars BUITEN de quotes. GEEN UITZONDERINGEN!
ok, maar ik zie geen slechte dingen tussen de naamgeving hooor....
Wat is er mis met
$sql1 $sql2 $sql3 ..
echo "<table border='0'>"; ..
user_id = '$row2->user_id'"; ..
?
SanThe schreef op 14.07.2008 12:07:
SELECT .. FROM .. WHERE .. ORDER BY aantal_punten.
Dat bedoel ik dus dat gaat niet...
Er moeten uit 3 verschillende tabellen gegevens worden gehaald.
En dan moet er worden gesorteerd op grootte van de som van totaal_verdediging + totaal_aanval
Gewijzigd op 01/01/1970 01:00:00 door Dennis
weet jij wat je in $sql1 doet? Nee! Maak er iets van wat ergens op slaat, $sql_users oid. Wees duidelijk , helpt zo veel bij debuggen.
daarachter, enkele quotes buiten, dubbel binnen. staat er gewoon, lijkt me niet zo lastig...
zelfde als vars buiten de quotes houden...
lees eerst even goed de posts door voordat je gaat blaten
Verder ontbreekt elke vorm van foutafhandeling.
wes schreef op 14.07.2008 13:56:
Ik zeg toch wat er mis mee is.
weet jij wat je in $sql1 doet? Nee! Maak er iets van wat ergens op slaat, $sql_users oid. Wees duidelijk , helpt zo veel bij debuggen.
daarachter, enkele quotes buiten, dubbel binnen. staat er gewoon, lijkt me niet zo lastig...
zelfde als vars buiten de quotes houden...
lees eerst even goed de posts door voordat je gaat blaten
weet jij wat je in $sql1 doet? Nee! Maak er iets van wat ergens op slaat, $sql_users oid. Wees duidelijk , helpt zo veel bij debuggen.
daarachter, enkele quotes buiten, dubbel binnen. staat er gewoon, lijkt me niet zo lastig...
zelfde als vars buiten de quotes houden...
lees eerst even goed de posts door voordat je gaat blaten
Joh leer jij eens een goede beschrijving van het probleem geven ipv woordjes op te sommen.
Beginners hebben niet zoveel ervaring en als mensen dan ook nog eens wartaal uit gaan slaan, dan is het toch niet te begrijpen?
Ik ben hier om een antwoord te krijgen op mijn probleem en niet om mijn code te posten zodat iedereen kan zien hoe onervaren ik ben...
SanThe schreef op 14.07.2008 14:02:
Verder ontbreekt elke vorm van foutafhandeling.
Joh als je me echt wilt afzeiken dan nodig ik je graag bij mij thuis uit zodat je de HELE code kan zien!!!
Even ontopic heeft iemand een idee?
Gewijzigd op 01/01/1970 01:00:00 door Dennis
Als ik het zo snel zie moet je gebruik gaan maken van INNER JOINS... Hoe zien je tabellen eruit?
Als ik het goed begrijp, heeft elk lid een aantal punten dat je per clan wilt optellen en dan sorteren naar clan met het grootste puntentotaal? Dan moeten we even weten hoe je datamodel eruit ziet. Wat voor tabellen heb je en welke velden zitten daarin?
Dat helpt, dan zal ik even kijken hoe dat werkt.
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
CREATE TABLE `clan` (
`clan_id` INT(4) NOT NULL AUTO_INCREMENT,
`clan_naam` VARCHAR(30) NOT NULL DEFAULT 'Dit is het profiel van de clan',
`clan_profiel` VARCHAR(500) NOT NULL,
PRIMARY KEY(`clan_id`)
);
CREATE TABLE `clanleden` (
`clanlid_id` INT(15) NOT NULL AUTO_INCREMENT,
`clan_id` INT(4) NOT NULL,
`user_id` INT(12) NOT NULL,
`type` INT(1) NOT NULL,
PRIMARY KEY(`clanlid_id`)
);
CREATE TABLE `user` (
`user_id` INT(12) NOT NULL AUTO_INCREMENT,
`naam` VARCHAR(30) NOT NULL,
`email` VARCHAR(40) NOT NULL,
`password` VARCHAR(50) NOT NULL,
`activatiecode` VARCHAR(30) NOT NULL,
`geactiveerd` INT(1) NOT NULL DEFAULT '0',
`type` INT(1) NOT NULL DEFAULT '1',
`sessie_id` VARCHAR(50) NOT NULL DEFAULT '0',
`gebruikt_ip` VARCHAR(30) NOT NULL DEFAULT '0',
`kliks` INT(10) NOT NULL DEFAULT '0',
`speeltype` INT(1) NOT NULL,
`cashgeld` INT(16) NOT NULL DEFAULT '1500',
`bankgeld` INT(16) NOT NULL DEFAULT '5000',
`totaal_verdediging` INT(16) NOT NULL DEFAULT '0',
`totaal_aanval` INT(16) NOT NULL DEFAULT '0',
`hitpoints` INT(4) NOT NULL DEFAULT '100',
`laatstonline` INT(10) NOT NULL,
`laatstaanval` INT(10) NOT NULL DEFAULT '0',
`levelaanval` INT(2) NOT NULL DEFAULT '1',
`levelverdediging` INT(2) NOT NULL DEFAULT '1',
`levelrecruit` INT(2) NOT NULL DEFAULT '1',
`levelhitpoints` INT(2) NOT NULL DEFAULT '1',
`levelaanvaldag` INT(2) NOT NULL DEFAULT '1',
`levelhq` INT(2) NOT NULL DEFAULT '1',
PRIMARY KEY(`user_id`)
);
`clan_id` INT(4) NOT NULL AUTO_INCREMENT,
`clan_naam` VARCHAR(30) NOT NULL DEFAULT 'Dit is het profiel van de clan',
`clan_profiel` VARCHAR(500) NOT NULL,
PRIMARY KEY(`clan_id`)
);
CREATE TABLE `clanleden` (
`clanlid_id` INT(15) NOT NULL AUTO_INCREMENT,
`clan_id` INT(4) NOT NULL,
`user_id` INT(12) NOT NULL,
`type` INT(1) NOT NULL,
PRIMARY KEY(`clanlid_id`)
);
CREATE TABLE `user` (
`user_id` INT(12) NOT NULL AUTO_INCREMENT,
`naam` VARCHAR(30) NOT NULL,
`email` VARCHAR(40) NOT NULL,
`password` VARCHAR(50) NOT NULL,
`activatiecode` VARCHAR(30) NOT NULL,
`geactiveerd` INT(1) NOT NULL DEFAULT '0',
`type` INT(1) NOT NULL DEFAULT '1',
`sessie_id` VARCHAR(50) NOT NULL DEFAULT '0',
`gebruikt_ip` VARCHAR(30) NOT NULL DEFAULT '0',
`kliks` INT(10) NOT NULL DEFAULT '0',
`speeltype` INT(1) NOT NULL,
`cashgeld` INT(16) NOT NULL DEFAULT '1500',
`bankgeld` INT(16) NOT NULL DEFAULT '5000',
`totaal_verdediging` INT(16) NOT NULL DEFAULT '0',
`totaal_aanval` INT(16) NOT NULL DEFAULT '0',
`hitpoints` INT(4) NOT NULL DEFAULT '100',
`laatstonline` INT(10) NOT NULL,
`laatstaanval` INT(10) NOT NULL DEFAULT '0',
`levelaanval` INT(2) NOT NULL DEFAULT '1',
`levelverdediging` INT(2) NOT NULL DEFAULT '1',
`levelrecruit` INT(2) NOT NULL DEFAULT '1',
`levelhitpoints` INT(2) NOT NULL DEFAULT '1',
`levelaanvaldag` INT(2) NOT NULL DEFAULT '1',
`levelhq` INT(2) NOT NULL DEFAULT '1',
PRIMARY KEY(`user_id`)
);
Jan Koehoorn schreef op 14.07.2008 22:43:
Als ik het goed begrijp, heeft elk lid een aantal punten dat je per clan wilt optellen en dan sorteren naar clan met het grootste puntentotaal? Dan moeten we even weten hoe je datamodel eruit ziet. Wat voor tabellen heb je en welke velden zitten daarin?
Ja sorry voor mijn misschien foute formulering, maar dit is precies wat ik bedoel
Gewijzigd op 01/01/1970 01:00:00 door Dennis
Edit: dan zou je namelijk zoiets kunnen doen:
SELECT SUM(punten) AS totaal
FROM users
GROUP BY clan_id
ORDER BY totaal DESC
Gewijzigd op 01/01/1970 01:00:00 door Jan Koehoorn
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?
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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
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?
Gewijzigd op 01/01/1970 01:00:00 door Joren de Wit
Blanche, ik ga je code eens proberen. Alvast onwijs bedankt voor de hulp!
Behoort een gebruiker tot geen enkele clan, dan zijn die velden gewoon leeg...
Ok dus je zou alleen je tabel hoeven/moeten optimaliseren en te splitsen als het een 1 op meer relatie zou zijn?
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.
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 :(
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
<?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>";
?>
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) )
Gewijzigd op 01/01/1970 01:00:00 door Dennis