Avatar billede daddy Novice
20. december 2004 - 18:47 Der er 13 kommentarer og
2 løsninger

PHP/MySql - tæl sammen fra flere tabeller

Jeg har en stak mysql tabeller.

#users
--------
username
note

#runde1
--------
username
total

runde1 findes der 13 stk af. (runde2, runde3 osv)

username

Hvordan gør jeg så der bliver lavet en liste med alle "username" fra "users". Hvor tilsvarende "username" fra runde1-13 findes og "total" for den user lægges sammen fra alle "runde1-13"

Det skal være så det ikke er nødvendigt, at en username er med i hver runde tabel.

skal bare spytte en simple liste ud som denne:

hans - 23
peter - 20
kirsten - 19
osv..
Avatar billede stefmeister Nybegynder
20. december 2004 - 19:31 #1
Den fattede jeg ikke lige?

men tror du mener noget i stil med:

$sql = "SELECT username FROM usertabel WHERE ORDER BY username asc";
$qh = mysql_query( $sql ) or die( "Unable to connect to SQL server" );
while ( $row = mysql_fetch_assoc( $qh ) ) {

echo $row[username].'<br>';

}
Avatar billede daddy Novice
20. december 2004 - 19:46 #2
Nej ikke lige sådan. kan godt se min forklaring blev lidt rodet. Jeg prøver lige at gøre det forståligt for andre end mig selv.

Det skal lave en liste med alle brugere fra #users.

Hver bruger findes i én eller flere af de 13 #runde1-13 og her har han en værdi(total) som skal lægges sammen for alle de #runde han er med i.

feks $total = $total1 + $total4 + $total9

Så man til sidst kan udskrive en liste hvor brugernavn og dennes samlede værdi fremgår.

Håber det er lidt mindre sluderet end det første.
Avatar billede baitianlong Nybegynder
20. december 2004 - 19:54 #3
Jeg tror det er noget med:

$query = mysql_query("SELECT username FROM users");
while($row = mysql_fetch_assoc($query)) {
  $points = 0;
  for($i=1;$i<14;$i++) {
      $rundequery = mysql_query("SELECT total FROM runde".$i." WHERE username = ".$row['username']);
      while($row2 = mysql_fetch_assoc($rundequery)) {
        $points += $row2['total'];
      }
  }
  print($username." - ".$points);
}

Det skulle gerne give det ønskede resultat :)
Avatar billede baitianlong Nybegynder
20. december 2004 - 19:56 #4
Den her skal måske have ' ' på, sådan her:

$rundequery = mysql_query("SELECT total FROM runde".$i." WHERE username = '".$row['username']."'");

...men jeg regner med det fungerer :)
Avatar billede daddy Novice
20. december 2004 - 20:46 #5
Jeg rettede en smule, da brugernavnet ikke blev udskrevet.

$query = mysql_query("SELECT username FROM users");
while($row = mysql_fetch_assoc($query)) {
  $points = 0;
  for($i=1;$i<14;$i++) {
      $rundequery = mysql_query("SELECT * FROM runde".$i." WHERE user = '".$row['username']."' ORDER BY total");
      while($row2 = mysql_fetch_assoc($rundequery)) {
        $points += $row2['total'];
        $username = $row2['user'];       
      }
  }
print($username." - ".$points);
print "<br>";
}

Hvordan kan man gøre så listen bliver sorteret efter "total"?
Avatar billede baitianlong Nybegynder
20. december 2004 - 22:02 #6
Sådan her:

$userpoints = array();
$query = mysql_query("SELECT username FROM users");
while($row = mysql_fetch_assoc($query)) {
  $points = 0;
  $username = $row['username'];
  for($i=1;$i<14;$i++) {
      $rundequery = mysql_query("SELECT * FROM runde".$i." WHERE user = '".$username."'");
      while($row2 = mysql_fetch_assoc($rundequery)) {
        $points += $row2['total'];     
      }
  }
  array_push($userpoints, $points."|".$username."<br>");
}
asort($userpoints);
foreach($userpoints as $up) {
  list($upoints, $user) = explode("|", $userpoints);
  print($user." - ".$upoints);
}

:)
Avatar billede baitianlong Nybegynder
20. december 2004 - 22:03 #7
Hov:

list($upoints, $user) = explode("|", $up);

..sådan der
Avatar billede daddy Novice
20. december 2004 - 22:23 #8
En sidste ting, så er det helt perfekt.

Når den sortere, så gør den det feks således:

10
12
1
22
37
3

ville gerne hvis det kunne laves, så den gjorde så feks 1 kommer før 10, og at den sorterede så det største kom øverst.

37
22
12
10
3
1

Det er mere end jeg først har spurgt efter, så er selvfølgelig villig til at smide flere point til dig :-)

Mange tak for hjælpen
Avatar billede baitianlong Nybegynder
20. december 2004 - 22:58 #9
ok, jeg kan godt se den sorterer lidt åndssvagt.

$userpoints = array();
$query = mysql_query("SELECT username FROM users");
while($row = mysql_fetch_assoc($query)) {
  $points = 0;
  $username = $row['username'];
  for($i=1;$i<14;$i++) {
      $rundequery = mysql_query("SELECT * FROM runde".$i." WHERE user = '".$username."'");
      while($row2 = mysql_fetch_assoc($rundequery)) {
        $points += $row2['total'];     
      }
  }
  if($points < 10) $points = "0".$points;
  array_push($userpoints, $points."|".$username."<br>");
}
rsort($userpoints);
foreach($userpoints as $up) {
  list($upoints, $user) = explode("|", $userpoints);
  print($user." - ".$upoints);
}

Jeg tror det er fikser nu :)
Avatar billede daddy Novice
20. december 2004 - 23:02 #10
Den går helt amok. Den udskriver:

- Array - Array - Array - Array - Array - Array - Array - Array - Array - Array - Array - Array - Array - Array - Array - Array - Array - Array - Array - Array - Array - Array - Array - Array - Array - Array - Array - Array - Array - Array - Array - Array - Array - Array - Array - Array - Array - Array - Array - Array - Array - Array - Array - Array - Array - Array - Array - Array - Array - Array - Array - Array - Array - Array - Array - Array - Array - Array - Array - Array - Array - Array - Array - Array - Array - Array - Array - Array - Array - Array - Array - Array - Array - Array - Array - Array - Array - Array - Array - Array - Array - Array - Array - Array - Array - Array - Array - Array - Array - Array - Array - Array - Array - Array - Array - Array - Array - Array - Array - Array - Array - Array - Array - Array - Array - Array - Array - Array - Array - Array - Array - Array - Array - Array - Array - Array - Array - Array - Array - Array - Array - Array - Array - Array - Array - Array - Array - Array - Array - Array - Array - Array - Array - Array - Array - Array - Array - Array - Array - Array - Array - Array - Array - Array - Array - Array - Array - Array - Array - Array - Array - Array - Array - Array - Array - Array - Array - Array - Array - Array - Array - Array - Array
Avatar billede baitianlong Nybegynder
20. december 2004 - 23:09 #11
Endnu en gang...

Hov:

list($upoints, $user) = explode("|", $up);

..sådan der
Avatar billede daddy Novice
20. december 2004 - 23:15 #12
Nu begynder jeg at føle mig lidt vanskelig :-(

Det er helt perfekt fra én lille bitte ting.

Når den feks skal skrive "1" så skriver den "01". Kan det undgåes?

Jeg siger mange tak for din store tålmodighed og hjælp. Vil du have flere point, nu da opgaven blev mere tidskrævende end først tiltænkt?
Avatar billede baitianlong Nybegynder
21. december 2004 - 00:40 #13
Jamen, det er sådan lidt sjovt med de nuller... Vi sætter dem på her:

if($points < 10) $points = "0".$points;

For at den skal sortere rigtigt. Ellers kommer 1 før 12. Nu skal vi så pille dem af efter, der er sorteret. Vi kan ikke bruge en funktion, der fjerner nuller, for så vil f.eks 20 jo blive til 2. Derfor må vi bruge strpos.

foreach($userpoints as $up) {
  list($upoints, $user) = explode("|", $up);
  if(strpos("".$upoints, "0") == 0) {
    $upoints = substr("".$upoints, 1);
  }
  print($user." - ".$upoints);
}

Det skal så ind under rsort(), der hvor noget af det er, så tror jeg den vil gøre det ! :) Du må lige prøve den af, for jeg ved ikke helt om den returnerer 0. Hvis den gør skal det være:

foreach($userpoints as $up) {
  list($upoints, $user) = explode("|", $up);
  if(strpos("".$upoints, "0") == 0 && strpos("".$upoints, "0") !== false) {
    $upoints = substr("".$upoints, 1);
  }
  print($user." - ".$upoints);
}

..eller sådan noget :)
Avatar billede daddy Novice
21. december 2004 - 01:28 #14
BINGO :-)

Mange tak
Avatar billede baitianlong Nybegynder
21. december 2004 - 01:36 #15
Selv tak :)
Avatar billede Ny bruger Nybegynder

Din løsning...

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.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester