Avatar billede cmp77 Nybegynder
30. december 2003 - 02:34 Der er 8 kommentarer og
1 løsning

Udtræk skal fordeles på flere tables

Hej hej!

Nu har jeg efterhånden brugt adskillige timer her på eksperten.dk, men har endnu ikke fundet svar på mit problem...

Jeg har et udtræk fra en DB på ca. 1200 rækker der gerne skal fordeles ud i tre tables, så det endelige resultat bliver noget i denne stil...

<TABLE>
  <TR>
    <TD>***FØRSTE TABLE MED DE FØRSTE 400 RÆKKER***</TD>
    <TD>***ANDEN TABLE MED DE NÆSTE 400 RÆKKER***</TD>
    <TD>***TREDJE TABLE MED DE SIDSTE 400 RÆKKER***</TD>
  <TR>
</TABLE>

Mit udtræk ser ud som følger...

$result = mysql("$dbname", "SELECT * FROM postnumre ORDER BY nummer ASC LIMIT 1200");
while ($row = mysql_fetch_row($result)) {
  $ZIP_NUMB = $row[0];
  $ZIP_NAME = $row[1];

  $result2 = mysql("$dbname","SELECT zip FROM medlemmer WHERE zip = '$ZIP_NUMB' AND country = 'Danmark'");
  $no_pr_zip = mysql_numrows($result2);

  echo "
  <TR>
    <TD>$ZIP_NUMB $ZIP_NAME</TD>
    <TD>$no_pr_zip</TD>
  </TR>";
}

Jeg ved ikke lige om jeg har fået forklaret mit problem godt nok, ellers må I lige råbe højt så jeg kan uddybe lidt mere.

På forhånd tak og med venlig hilsen

/cmp77
Avatar billede detox Nybegynder
30. december 2003 - 02:56 #1
For det første tror jeg du skal lave dine forespørgsler om til en forespørgsel i den her stil (såfremt dit første felt i postnumre hedder 'zip):

SELECT a.*, count(*) AS antal FROM postnumre a
LEFT JOIN medlemmer b ON a.zip = b.zip
WHERE b.country='Danmark'
GROUP  BY b.zip
Avatar billede detox Nybegynder
30. december 2003 - 03:33 #2
Så vil jeg mene du kan lave det sådan her:

<?php
require 'db.php'; // Forbindelse til din database
$res = mysql_query("SELECT a.*, count(*) AS antal FROM postnumre a
LEFT JOIN medlemmer b ON a.zip = b.zip // brug DIT feltnavn
WHERE b.country='Danmark' GROUP  BY b.zip");
$ialt = mysql_num_rows($res);
$tre = round($ialt/3);
$k = $ialt-($tre*3);
while ($row = mysql_fetch_assoc($res)) {
    $nummer[] = $row['zip']; // brug DIT feltnavn
    $navn[] = $row['name']; // brug DIT feltnavn
    $antal[] = $row['antal'];
}
?>
<table>
  <tr>
    <td>
    <table>
    <?
    for ($i=0;$i<$tre+$k;$i++) {
      echo "<tr><td>$nummer[$i] $navn[$i]</td><td>$antal[$i]</td></tr>";
    }
    ?>
    </table>
    </td>
    <td>
    <table>
    <?
    for ($i=$tre+$k;$i<($tre*2)+$k;$i++) {
      echo "<tr><td>$nummer[$i] $navn[$i]</td><td>$antal[$i]</td></tr>";
    }
    ?>
    </table>
    </td>
    <td>
    <table>
    <?
    for ($i=($tre*2)+$k;$i<$ialt;$i++) {
      echo "<tr><td>$nummer[$i] $navn[$i]</td><td>$antal[$i]</td></tr>";
    }
    ?>
    </table>
    </td>
  <tr>
</table>
Avatar billede detox Nybegynder
30. december 2003 - 03:36 #3
Og så skulle du måske lige tilføje:
mysql_free_result($res);
og
unset($nummer, $navn, $antal);
Avatar billede tefcke Nybegynder
30. december 2003 - 14:11 #4
$k = $ialt-($tre*3); er vel bare en modulo beregning ($k = $ialt % 3)
Avatar billede detox Nybegynder
30. december 2003 - 14:27 #5
tefcke -> Ja, det er korrekt :o)
Avatar billede cmp77 Nybegynder
03. januar 2004 - 22:18 #6
Detox>> Så fik jeg endelig tid til at prøve det, og det virker som det skal. Mange tak! Dog har jeg en lille bøn...

Som det ser ud nu, får jeg et resultat på 8 rækker, fordelt på tre tables, hvilket i princippet er godt nok.
Mit problem nu er at, der er to rækker i det første table og tre i de næste to (kan du følge mig?). Det vil jeg gerne have lavet om, således at det sidste table altid vil indeholde det mindste antal rækker, da reultatet gerne skal kunne printes ud. Er det muligt??
Avatar billede detox Nybegynder
04. januar 2004 - 02:04 #7
Jeg er ikke helt sikker på hvordan man gør det nemmest. Du kan prøve med:

<?php
require 'db.php'; // Forbindelse til din database
$res = mysql_query("SELECT a.*, count(*) AS antal FROM postnumre a
LEFT JOIN medlemmer b ON a.zip = b.zip
WHERE b.country='Danmark' GROUP  BY b.zip");
$ialt = mysql_num_rows($res);
$tre = ceil($ialt/3);
while ($row = mysql_fetch_assoc($res)) {
    $nummer[] = $row['zip']; // brug DIT feltnavn
    $navn[] = $row['name']; // brug DIT feltnavn
    $antal[] = $row['antal'];
}
?>
<table>
  <tr>
    <td>
    <table>
    <?
    for ($i=0;$i<$tre;$i++) {
      echo "<tr><td>$nummer[$i] $navn[$i]</td><td>$antal[$i]</td></tr>";
    }
    ?>
    </table>
    </td>
    <td>
    <table>
    <?
    for ($i=$tre;$i<($tre*2);$i++) {
      echo "<tr><td>$nummer[$i] $navn[$i]</td><td>$antal[$i]</td></tr>";
    }
    ?>
    </table>
    </td>
    <td>
    <table>
    <?
    for ($i=($tre*2);$i<$ialt;$i++) {
      echo "<tr><td>$nummer[$i] $navn[$i]</td><td>$antal[$i]</td></tr>";
    }
    ?>
    </table>
    </td>
  <tr>
</table>
Avatar billede cmp77 Nybegynder
04. januar 2004 - 14:35 #8
Perfekt! Takker mange gange! :)
Avatar billede detox Nybegynder
05. januar 2004 - 00:32 #9
Velbekommen c",)
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