Resultaten laten zien uit een MySQL tabel waarbij de grootste eerst

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Pagina: 1 2 volgende »

Dennis

Dennis

14/07/2008 12:00:00
Quote Anchor link
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
Code (php)
PHP script in nieuw venster Selecteer het PHP script
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
<?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.
Gewijzigd op 01/01/1970 01:00:00 door Dennis
 
PHP hulp

PHP hulp

22/11/2024 19:54:28
 
- wes  -

- wes -

14/07/2008 12:03:00
Quote Anchor link
$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!
 
- SanThe -

- SanThe -

14/07/2008 12:07:00
Quote Anchor link
SELECT .. FROM .. WHERE .. ORDER BY aantal_punten.
 
Dennis

Dennis

14/07/2008 12:32:00
Quote Anchor link
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!


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
 
- wes  -

- wes -

14/07/2008 13:56:00
Quote Anchor link
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
 
- SanThe -

- SanThe -

14/07/2008 14:02:00
Quote Anchor link
Verder ontbreekt elke vorm van foutafhandeling.
 
Dennis

Dennis

14/07/2008 22:37:00
Quote Anchor link
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


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
 
Jeroen G

Jeroen G

14/07/2008 22:40:00
Quote Anchor link
Als ik het zo snel zie moet je gebruik gaan maken van INNER JOINS... Hoe zien je tabellen eruit?
 
Jan Koehoorn

Jan Koehoorn

14/07/2008 22:43:00
Quote Anchor link
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?
 
Dennis

Dennis

14/07/2008 22:44:00
Quote Anchor link
Oh ok dan.
Dat helpt, dan zal ik even kijken hoe dat werkt.

Code (php)
PHP script in nieuw venster Selecteer het PHP script
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
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`)
);


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
 
Jan Koehoorn

Jan Koehoorn

14/07/2008 22:48:00
Quote Anchor link
Waarom heb je de tabel 'clanleden' nodig? Je hebt clans en users. Een veld clan_id in de tabel users zou toch voldoende zijn?

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
 
Dennis

Dennis

14/07/2008 22:51:00
Quote Anchor link
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?
 
Jan Koehoorn

Jan Koehoorn

14/07/2008 22:52:00
Quote Anchor link
Als een user niet in een clan zit kun je het veld clan_id gewoon leeg laten toch?
 
Joren de Wit

Joren de Wit

14/07/2008 22:53:00
Quote Anchor link
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
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

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
 
Dennis

Dennis

14/07/2008 22:55:00
Quote Anchor link
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!
 
Joren de Wit

Joren de Wit

14/07/2008 22:57:00
Quote Anchor link
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...
 
Dennis

Dennis

14/07/2008 23:00:00
Quote Anchor link
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?
 
Joren de Wit

Joren de Wit

14/07/2008 23:02:00
Quote Anchor link
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...
 
Jan Koehoorn

Jan Koehoorn

14/07/2008 23:03:00
Quote Anchor link
Bij een 1 op veel relatie heb je twee tabellen nodig. Bij een veel op veel relatie een koppeltabel.
 
Dennis

Dennis

14/07/2008 23:11:00
Quote Anchor link
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 :(

Code (php)
PHP script in nieuw venster Selecteer het PHP script
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
<?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) )
Gewijzigd op 01/01/1970 01:00:00 door Dennis
 
Joren de Wit

Joren de Wit

14/07/2008 23:18:00
Quote Anchor link
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.
 

Pagina: 1 2 volgende »



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.