Avatar billede zac Nybegynder
25. oktober 2005 - 21:41 Der er 16 kommentarer og
1 løsning

Sammenhæng mellem to tabeller, query inden i hinanden

Vil gerne have to tabeller, kapitler og artikler, til at hænge sammen i visning af titler. KapitelId felt i begge, fremmednøgle i artikler. Vil have
Kap 1 - Art 11
        Art 12
        Art 13
Kap 2 - Art 21
        Art 22
Kap 3 - Art 31

// ydre query, skal fange kapitel titler
$result1 = mysql_query( "SELECT k.kapitelId, k.kapTitel FROM kapitler AS k" );   
while ($row = mysql_fetch_array($result1))
{
$kapitelId  = $row["kapitelId"];           
$kapTitel    = $row["kapTitel"];
echo $kapTitel . "<br>";    //så langt så godt, lister kapitel titler
             
$array = array($kapitelId);
foreach ($array as $value) 
//vil have kapitel id til valg af artikler – og når indholdet i {} nedenfor slås fra og erstattes med echo $value vises dette id faktisk, men som det kommer nu vises intet:
{
// indre query, skal fange de enkelte kapitlers artikler
$result2 = mysql_query( "SELECT a.artikelId, a.artTitel FROM artikler AS a WHERE a.artikelId = $value" );
       
while($row = mysql_fetch_array($result2)
{                   
$artTitel  = $row["artTitel"];           
echo $artTitel . "<br>";           
}                     
}   
}

Men det fungerer altså ikke. Hvorfor ikke? Noget bedre løsninger?
Avatar billede mahler Nybegynder
25. oktober 2005 - 21:44 #1
øhh... skulle det ikke være a.kapitelId="$value"?
Avatar billede zac Nybegynder
25. oktober 2005 - 21:47 #2
JO, undskyld! det er den også i originalen (jeg prøvede at skrive den om i pædagogisk form, men så gik det altså galt...).
Men det virker ikke!
Avatar billede mahler Nybegynder
25. oktober 2005 - 21:49 #3
prøv at sætte din value i quotes:

$result2 = mysql_query( "SELECT a.artikelId, a.artTitel FROM artikler AS a WHERE a.kapitelId = \"$value\"" );
Avatar billede zac Nybegynder
25. oktober 2005 - 21:49 #4
Almen bemærkning: Jeg har ikke kunnet finde ud af at skrive spm. med indrykninger, tab forsvinder, når man kopierer teksten ind, er der noget at gøre ved det?
Avatar billede zac Nybegynder
25. oktober 2005 - 21:51 #5
value i quotes, \"$value\" - gør ingen forskel...
Avatar billede mahler Nybegynder
25. oktober 2005 - 21:51 #6
brug spaces i stedet for tabes i din kode - eller læg et link til et sted hvor man kan se den i stedet.
Avatar billede zac Nybegynder
25. oktober 2005 - 21:54 #7
tænkte det nok...
Avatar billede mahler Nybegynder
25. oktober 2005 - 21:55 #8
Jeg forstår ikke helt hvad du vil med foreach'en... det er jo whilen, der looper kapitlerne...

Hvad med:
---
// ydre query, skal fange kapitel titler
$result1 = mysql_query( "SELECT k.kapitelId, k.kapTitel FROM kapitler AS k" );   
while ($row = mysql_fetch_array($result1))
{
  $kapitelId  = $row["kapitelId"];           
  $kapTitel    = $row["kapTitel"];
  echo $kapTitel . "<br>";    //så langt så godt, lister kapitel titler
             
  $result2 = mysql_query( "SELECT a.artikelId, a.artTitel FROM artikler AS a WHERE a.artikelId = \"$kapitelId\"" );   
  while($row2 = mysql_fetch_array($result2)
  {                   
      $artTitel  = $row2["artTitel"];           
      echo $artTitel . "<br>";                                 
  }   
}
Avatar billede zac Nybegynder
25. oktober 2005 - 22:13 #9
Den strategi, to x while, har jeg også prøvet, men den går ned.

Når man slår $result2 fra, dvs. denne her indskudt $result2/while:

$result2 = mysql_query( "SELECT a.artikelId, a.artTitel FROM artikler AS a WHERE a.kapitelId = \"$kapitelId\"" );   
while($row2 = mysql_fetch_array($result2)
  {                   
      $artTitel  = $row2["artTitel"];           
      echo $artTitel . "<br>";                                 
  } 
- så den her er alene:
$result1 = mysql_query( "SELECT k.kapitelId, k.kapTitel FROM kapitler AS k" );   
while ($row = mysql_fetch_array($result1))
{
  $kapitelId  = $row["kapitelId"];           
  $kapTitel    = $row["kapTitel"];
  echo $kapTitel . "<br>";    //så langt så godt, lister kapitel titler
  //$result2 taget ud... 
}
- så kommer kapitel titlerne fint igennem.

Slår man den til igen, giver det blank side!
Avatar billede zac Nybegynder
25. oktober 2005 - 22:16 #10
Spørgsmålet er: Hvorfor kan man ikke lave en while i en while med en værdi fra den første som query kriterium i den sidste?
Avatar billede mahler Nybegynder
25. oktober 2005 - 22:34 #11
Det kan du også, men man skal passe på...

I din source har du:
while ($row = mysql_fetch_array($result1))

og i et loop indenfor while'n har du:
while($row = mysql_fetch_array($result2)

Det er ikke godt med $row begge steder...
Avatar billede zac Nybegynder
25. oktober 2005 - 23:21 #12
Hm, kan ikke se, det skulle gøre nogen forskel - det gør i hvert fald ingen forskel, statig død side.

En anden strategi kunne måske være subquery i en from clause
(jf. http://dev.mysql.com/doc/refman/5.0/en/unnamed-views.html) - men jeg kan ikke gennemskue det. Så skulle der vælges fra både kapitler og artikler fra begyndelsen...
Avatar billede mahler Nybegynder
26. oktober 2005 - 07:35 #13
Kan du ikke lige smide dine tabel definitioner? (for artikler og kapitler)

Så kan jeg lige prøve at lege lidt på min server...
Avatar billede zac Nybegynder
26. oktober 2005 - 08:47 #14
så tidligt:-)

CREATE TABLE `artikler` (
  `artikelId` int(3) NOT NULL auto_increment,
  `kapitelId` int(3) default NULL,
  `artTitel` varchar(250) default NULL,
  `artSortNr` int(3) default NULL,
  `artSammenfatning` text,
  `artTekst` text,
  PRIMARY KEY  (`artikelId`),
  KEY `kapitelId` (`kapitelId`)
) ENGINE=MyISAM AUTO_INCREMENT=1 ;

CREATE TABLE `kapitler` (
  `kapitelId` int(5) NOT NULL auto_increment,
  `kapNr` int(5) NOT NULL default '0',
  `kapTitel` varchar(250) NOT NULL default '',
  PRIMARY KEY  (`kapitelId`)
) ENGINE=MyISAM AUTO_INCREMENT=1 ;
Avatar billede zac Nybegynder
26. oktober 2005 - 08:55 #15
den her har while loop i while loop, men med træk på samme tabel:
http://www.sitemasters.be/?pagina=forum/index&ond=reply&cat=2&id=8078
Avatar billede zac Nybegynder
26. oktober 2005 - 13:48 #16
Jeg ved ikke, hvad der har været galt, men nu virker det - med denne her:

        $result1 = mysql_query( "SELECT kapitelId AS id, kapTitel
        FROM kapitler
        ");
           
        while ($row1 = mysql_fetch_array($result1))
        {           
            $kapTitel  = $row1["kapTitel"];
            $id        = $row1["id"];               
            echo "<b>" . $kapTitel . "</b><br>";
           
            $result2 = mysql_query( "SELECT artTitel
                FROM artikler
                WHERE kapitelId = '$id'
                ORDER BY artSortNr
                ");   
               
                while ($row2 = mysql_fetch_array($result2))
                {                                       
                    $artTitel  = $row2["artTitel"];           
                  echo $artTitel . "<br>";             
              }                 
        }
Avatar billede zac Nybegynder
26. oktober 2005 - 13:49 #17
tak mahler, det var måske alligevel det med at skelne mellem result1 og 2 og row1 og 2, som gav gennembruddet
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
Computerworld tilbyder specialiserede kurser i database-management

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