Jan: PHP & MySQL: zwei Tabellen gleichzeitig auslesen

Hi ich möchte zwei Tabellen gleichzeitig auslesen. Diese zwei Tabellen haben die selbe Struktur (also auch die selben Feldnamen) und unterscheiden sich nur im Namen und im Inhalt.

$id = mysql_query("SELECT * FROM table1,table2 WHERE table1.feldx='Biologie' && table1.feldx='Biologie'");

Soweit müsste es funktionieren. Nur weiter komme ich nicht, denn dieses PHP hier klappt leider nicht mehr: :-(

while ($zeile = mysql_fetch_array($id))
{
 $feldx = $zeile["feldx"];
 $feldy = $zeile["feldy"];
 echo $feldx." ".$feldy."<BR>";
}

Kann mir jemand helfen? Danke!

Gruss
Jan

  1. Hi ich möchte zwei Tabellen gleichzeitig auslesen. Diese zwei Tabellen haben die selbe Struktur (also auch die selben Feldnamen) und unterscheiden sich nur im Namen und im Inhalt.

    $id = mysql_query("SELECT * FROM table1,table2 WHERE table1.feldx='Biologie' && table1.feldx='Biologie'");

    Soweit müsste es funktionieren. Nur weiter komme ich nicht, denn dieses PHP hier klappt leider nicht mehr: :-(

    Schau mal in der mySQL-Doku oder in einem mySQL-Buch nach "JOIN". Es sollte auf einschlägigen PHP-Seiten dazu auch Tutorials geben. Wie genau ein JOIN aussieht, kommt auf die Tabellen an und wie Du die Daten haben möchtest.

    z.B. Das * steht für alle Spalten, du kannst auch nur eine Spalte angeben -> tabelle2.spaltenname

    SELECT tabelle1.*, tabelle2.* FROM tabelle1, tabelle2, WHERE tabelle1.spalteX='Biologie' AND tabelle2.spalteX='biologie';

    Die Tabelle die dabei heraus kommt, kannst Du dann über mysql_fetch_array() normal verarbeiten.

    MfG, André Laugks

    1. z.B. Das * steht für alle Spalten, du kannst auch nur eine Spalte angeben -> tabelle2.spaltenname

      SELECT tabelle1.*, tabelle2.* FROM tabelle1, tabelle2, WHERE tabelle1.spalteX='Biologie' AND tabelle2.spalteX='biologie';

      Hallo André,

      der Tip statt SELECT * FROM lieber SELECT tabelle1.*, tabelle2.* FROM zu verwenden war es.

      Jetzt funktioniert es! Vielen Dank!

      Jan

    2. Die Tabelle die dabei heraus kommt, kannst Du dann über mysql_fetch_array() normal verarbeiten.

      Hi,

      leider ist das Problem doch noch nicht weg. Hier nun mal mein Original-Script. Ich bekomme nur den ersten Datensatz super oft untereinander hingeschrieben. "data_referateheim" und "data_spickzettel" sind meine Tabellen. "cat","title" und "link" sind die Felder, die in beiden Tabellen vorhanden sind.

      $id = mysql_query("SELECT data_referateheim.*, data_spickzettel.* FROM data_referateheim,data_spickzettel WHERE data_referateheim.cat like 'deutsch' && data_spickzettel.cat like 'deutsch'");
      while ($zeile = mysql_fetch_array($id))
      {
       $title = $zeile["title"];
       $link = $zeile["link"];
       echo "$title $link <BR>";
      }

      Kann mir jemand helfen? Danke!

      Jan

      1. Hallo !

        leider ist das Problem doch noch nicht weg. Hier nun mal mein Original-Script. Ich bekomme nur den ersten Datensatz super oft untereinander hingeschrieben.

        Ich hatte es geahnt! ;-)

        Da du die beiden Tabellen _nicht_ miteinander verknüpft hast, hat MySQL dies für dich übernommen! Und zwar nach dem Motto: "Alles durcheinander mit Allem drauf!"

        Also: _Jeder_ Datensatz aus "data_referateheim" wurde mit _jedem_ Datensatz aus "data_spickzettel" verknüpft. Du hast die Tabellen quasi miteinander multipliziert.

        Wenn ich deine Problemstellung richtig verstanden habe, gibt es auch überhaupt kein Kriterium für die Verknüpfung der beiden Tabellen, da sie lauter unterschiedliche Daten enthalten.

        Du wolltest die Tabellen m.E. für die Abfrage "addieren".

        Dies ist aber IMHO so einfach nicht möglich, da bei deiner Abfrage die einzelnen Datensätze der Ergebnismenge auch doppelt so viele Felder enthielt, nämlich alle aus Tabelle 1 und alle aus Tabelle 2 (wohlgemerkt: "UND", nicht etwa "oder").

        M.E. musst die beiden Tabellen separat nacheinander abfragen.

        Alternativ könntest du evtl. die Daten beider Tabellen vor der gemeinsamen Abfrage in einer dritten (temporären) Tabelle zusammenfassen und dann die Abfrage über diese Tabelle laufen lassen.

        Eine andere Möglichkeit fällt mir auch nicht ein.

        Gruß,

        kerki

        1. M.E. musst die beiden Tabellen separat nacheinander abfragen.

          Hi kerki,

          danke für deine Antwort. Du hattest mich richtig verstanden. Nun weiss ich, warum ich auch warum ich es so lange erfolglos probiert habe -> Es geht überhaupt nicht :-)

          Ich werde jetzt eiden Tabellen separat nacheinander abfragen und das Array mit den Ergebnissen aus beiden Tabellen dann sortieren, sofern das möglich ist.

          Jan

          1. Hallo Jan,

            Ich werde jetzt eiden Tabellen separat nacheinander abfragen und das Array mit den Ergebnissen aus beiden Tabellen dann sortieren, sofern das möglich ist.

            Ich weiß ja nicht, was Du mit dem Ergebnis dann noch machen willst, aber es wird sicherlich schwierig, die Inhalte beider Tabellen auseinander zu halten.
            Vielleicht überlegst Du Dir, ob Du nicht beide Tabellen zu einer zusammenführen kannst. Wenn beide sowieso die gleiche Datenstruktur aufweisen, könntest Du ja ein zusätzliches Feld einführen, in dem dann steht, welchen Typ (Referat oder Spickzettel) der entsprechende Eintrag hat.
            Das ist dann im Prinzip genauso übersichtlich, wie zwei separate Tabellen. Und Du hast den Vorteil, wirklich gemeinsame Abfragen generieren zu können.

            Grüße
              Klaus

  2. Hi,

    while ($zeile = mysql_fetch_array($id))
    {
    $feldx = $zeile["feldx"];
    $feldy = $zeile["feldy"];
    echo $feldx." ".$feldy."<BR>";
    }

    Ich glaube Du hast hier einen kleinen Leichtsinnsfehler eingebaut. Gibt es "feldy" überhaupt in einer der Tabellen? Besser wäre, Du verwendest statt * im SELECT nur die Spaltennamen die du wirklich auslesen willst. Wenn in beiden Tabellen gleiche Spaltennamen vorkommen, kannst Du diese mit Aliasen verseehen:
    SELECT tab1.spalt1 AS mySpalt1, tab2.spalt1 AS mySpalt2 ...

    Prüfe Dein Skript nochmal genau, dann findest Du den Fehler bestimmt.

    Grüße
    Achim Schrepfer