Kai: PHP und mysql joins

Hallo liebe Leuts im Forum, ich brauche mal wieder euren Rat,
ich habe Folgenden PHP Code:
$monat = $_GET["monat"];

$qry = "SELECT blog_index.bid, blog_comment.cid, blog_index.stamp, blog_index.autor, blog_index.content, blog_index.thema  FROM blog_index INNER Join blog_comment ON blog_index.bid = blog_comment.bid WHERE archivstamp = '$monat'";
if (($res = mysql_query($qry)) && mysql_num_rows($res))
 {
   while ($row = mysql_fetch_object($res))
   {
     $bid = $row->bid;
     $cid = $row->cid;
     $autor = $row->autor;
     $thema = $row->thema;
     $content = $row->content;
     $datum = date("d.M.Y",$row->stamp);
     $uhrzeit = date("H:i",$row->stamp);
...ausgabe...

jetzt gibt es z.b. jeweils zwei Einträge für einen Monat mit jeweils einem oder zwei Kommentaren, es werden aber immer nur ein Eintrag mit einem Kommentar ausgegeben bzw. der gleichen Eintrag mit den jeweils unterschiedlichen Kommentaren.

Mein Ziel war es, alle Einträge zu einem Monat mit jeweils allen Kommentaren ausgeben zu lassen und da bräuchte ich mal euren Rat, schonmal danke, Kai.

  1. Ahoi Kai,

    $qry = "SELECT blog_index.bid, blog_comment.cid, blog_index.stamp, blog_index.autor, blog_index.content, blog_index.thema  FROM blog_index INNER Join blog_comment ON blog_index.bid = blog_comment.bid WHERE archivstamp = '$monat'";

    $qry = "SELECT * FROM blog_index "
           ."INNER JOIN blog_comment "
           ."ON(blog_index.bid = blog_comment.bid) "
           ."WHERE archivstamp = '$monat'";

    ich hab das jetzt mal so grob zusammen gefasst damits etwas
    übersichtlicher ist.

    das problem ist das zu blog_index.bid mehrere blog_comment.bid existieren, du aber INNER JOIN verwendest. das ist hier IMHO fehl am platz. du musst LEFT oder RIGHT JOIN benutzten. oder du machst 2 querys, also einmal:

    $qry = "SELECT * FROM blog_index "
           ."WHERE archivstamp = '$monat'";

    hier dann die while schleife in der du jeden eintrag zu dem monat ausgiebst und nach ausgabe des eintrags verwendust dessen bid und machst ein query an blog_comment.
    Also in etwa so:

    $qry = "SELECT * FROM blog_index "
           ."WHERE archivstamp = '$monat'";
    while(fetch object etc.)
    {
      ausgabe der einträge
      $qry = "SELECT * FROM blog_comment "
             ."WHERE bid= '$bid'";
      while(fetch object etc.)
      {
        ausgabe der komentare
      }
    }

    MfG

    --
    Alle Angaben wie immer ohne Gewähr
    PPPS: ich trinke gerne ab und an mal eine tote Tante.
    1. Danke für deine Antwort,
      ich habe jetzt nach deinem Rat folgendes Probiert:
      $monat = $_GET["monat"];

      $qry = mysql_query("SELECT * FROM blog_index WHERE archivstamp = '$monat'");
             while ($row = mysql_fetch_object($qry))
         {
           $bid = $row->bid;
           $autor = $row->autor;
           $thema = $row->thema;
           $content = $row->content;
           $datum = date("d.M.Y",$row->stamp);
           $uhrzeit = date("H:i",$row->stamp);

      echo"<h1>$thema&nbsp<br><span>$autor&nbsp | &nbsp $datum &nbsp $uhrzeit</span></h1>";
          echo nl2br ("<p>$content</p>");

      $qry = mysql_query("SELECT * FROM blog_comment WHERE bid = '$bid'");
             while ($row = mysql_fetch_object($qry))
         {
              $cid = $row->cid;
           echo "$cid <br>";
         }
      }
      das liefert aber auch nicht das gewünschte Ergebnis, jetzt bekomme ich zwar zu einem Eintrag alle Kommentare, aber nur zu einem Eintrag, auch wenn es für den jeweiligen Monat mehrere Einträge gibt.

      1. Ahoi Kai,

        das liefert aber auch nicht das gewünschte Ergebnis, jetzt bekomme ich zwar zu einem Eintrag alle Kommentare, aber nur zu einem Eintrag, auch wenn es für den jeweiligen Monat mehrere Einträge gibt.

        verständlich da du $qry =mysql(erstes query); und dann den inhalt davon
        mit $qry =mysql(zweites query); überschreibst, mach mal $qry_eintrag und
        $qry_komentare daraus.

        --
        Alle Angaben wie immer ohne Gewähr
        PPPS: ich trinke gerne ab und an mal eine tote Tante.
      2. ... so Fehler selber gefunden, ich hatte Variabeln den gleichen Namen gegeben und da kam dann was durcheinander, trotzdem nochmal danke für deinen Rat. Gruß, Kai.

      3. Ahoi Kai,

        $qry = mysql_query("SELECT * FROM blog_index WHERE archivstamp = '$monat'");

        hier sind noch 2 "mängel".

        1. "SELECT * FROM..." nur zu testzwecken, war schon OK das du dort die
           spaltennamen angegeben hast, änder das bitte
        2. Es empfiehlt sich das ganze wegen besserer fehlerfindung und
           übersichtlichkeit das ganze so zu schreiben:

        $query = "SELECT spalten FROM tabelle ...";
        $erg = mysql_query($query);

        die variablen namen sind natürlich frei zu wählen. anstatt $erg könntest
        du z.B. zur vermeidung von überschreibung $erg_tabellenname nehmen.

        MfG

        --
        Alle Angaben wie immer ohne Gewähr
        PPPS: ich trinke gerne ab und an mal eine tote Tante.