Brutha: Abfrage aus mehreren Tabellen

Hallo,

per mysql_query rufe ich bestimmte Spalten aus zwei verschiedenen Tabellen ab.

Wenn ich nun per

while ($row = mysql_fetch_assoc($result))
{
echo $row[tabelle_a.id];
}

die id der Einträge aus der ersten Tabelle abrufen möchte, funktioniert das nicht.
Wenn dort stattdessen nur
echo $row[id];
steht geht das einwandfrei, aber leider kann ich dann nunmal nicht bestimmen aus welcher der beiden Tabellen die id abgerufen werden soll.

Wie muss $row[tabelle_a.id] demnach richtig lauten? Muss ich evtl. den Punkt maskieren?

Gruß Brutha

  1. Hallo Brutha,

    Wie muss $row[tabelle_a.id] demnach richtig lauten? Muss ich evtl. den Punkt maskieren?

    du musst für dem Spaltennamen einen Alias-Namen verpassen.
    Bsp:

    $sql = "SELECT  
                tbl1.id AS id1,  
                tbl2.id AS id2  
            FROM [..]";  
      
    while ($row = mysql_fetch_assoc($result))  
    {  
        echo $row[id1]."/n";  
        echo $row[id2]."/n";  
    }
    

    Du kannst das AS auch weg lassen und den Alias-Namen direkt hinter den Spaltennamen schreiben (tbl1.id id1, tbl2.id id2).

    Grüße, Matze

    1. Moin!

      while ($row = mysql_fetch_assoc($result))
      {
          echo $row[id1]."/n";
          echo $row[id2]."/n";
      }[/code]

      Korrektur:

      while ($row = mysql_fetch_assoc($result))  
       {  
           echo $row['id1']."/n";  
           echo $row['id2']."/n";  
       }
      

      Es fehlten genau vier wichtige Quotas.

      Du kannst das AS auch weg lassen und den Alias-Namen direkt hinter den Spaltennamen schreiben (tbl1.id id1, tbl2.id id2).

      Toller Tip, der den SQL-Befehl zumindest für Menschen sehr viel weniger gut lesbar macht weil dieser dann nur an den Kommas erkennen kann, ob ein weiterer Spaltenname oder ein Alias folgt. Vier Zeichen die fehlten. Dafür 122 Zeichen getippt, die kein guter Ratschlag waren.

      Lag aber sicher an der Uhrzeit.

      *willauchmalmeckern*

      MFFG (Mit freundlich- friedfertigem Grinsen)

      fastix

      1. Mahlzeit!

        Lag aber sicher an der Uhrzeit.

        *willauchmalmeckern*

        Allerdings. Da zeigt sich auch noch deutlich die Trägheit.
        Copy&Paste. Der Fehler wurde also vom OP übernommen.

        Schande über mich! Aber nett, dass du auch noch die fachlich korrekte Version gepostet hast :)

        MFFG (Mit freundlich- friedfertigem Grinsen)

        ebenso, Matze

        1. Hello,

          Schande über mich! Aber nett, dass du auch noch die fachlich korrekte Version gepostet hast :)

          ... na mal abgesehen vom Zeilenumbruch. Oder sollte das "geteilt durch n" bedeuten? :-P;

          Liebe Grüße aus dem schönen Oberharz

          Tom vom Berg

          --
           ☻_
          /▌
          / \ Nur selber lernen macht schlau
          http://bergpost.annerschbarrich.de
          1. Hey Tom,

            ... na mal abgesehen vom Zeilenumbruch. Oder sollte das "geteilt durch n" bedeuten? :-P;

            ja ja, und oben ist auch noch ein Wort zu viel gewesen...
            Nimm es als *g* zum Sonntag ;)

            Grüße, Matze

          2. Moin!

            ... na mal abgesehen vom Zeilenumbruch. Oder sollte das "geteilt durch n" bedeuten? :-P;

            Nee. Das ist der Beweis dafür, dass einzelne Zeichen, die dazu noch optisch ähnliche Gegenstücke haben, schlecht als Fehlerquelle zu erkennen sind. Insbesondere wenn man keine Fehlermeldung und also keine Ahnung hat wonach man sucht. Hier wäre es erst beim Ausführen des Codes durch die Ausgaben aufgefallen.

            MFFG (Mit freundlich- friedfertigem Grinsen)

            fastix

      2. Hi!

        Du kannst das AS auch weg lassen und den Alias-Namen direkt hinter den Spaltennamen schreiben (tbl1.id id1, tbl2.id id2).
        Toller Tip, der den SQL-Befehl zumindest für Menschen sehr viel weniger gut lesbar macht weil dieser dann nur an den Kommas erkennen kann, ob ein weiterer Spaltenname oder ein Alias folgt. Vier Zeichen die fehlten. Dafür 122 Zeichen getippt, die kein guter Ratschlag waren.

        Es ist im Prinzip egal, wie man etwas schreibt, wenn man sich verlesen "will", dann macht man das, egal was da geschrieben steht. Ordentliche Optik hilft, verhindert aber Lesefehler nicht absolut.

        Du hast übersehen/unterschlagen, dass Matze jedem Ergebniswert eine eigene Zeile gegönnt hat. Insofern ist da nicht nur ein Komma als Trennzeichen, sondern die Spalten sind noch weitaus deutlicher voneinander abgegrenzt. Ein AS hilft dir nur dann einigermaßen als optische Trennhilfe, wenn du außerdem konsequent weitere Regeln beachtest, wie SQL-Syntax-Bestandteile in Großbuchstaben und Spaltennamen in Kleinbuchstaben zu notieren. Und auch dann ist Unachtsamkeit beim Lesen weiterhin ungünstig, denn du musst immer noch den Unterschied zwischen Punkten von Kommas beachten, vor allem dann, wenn nicht für jede Spalte ein Alias vergeben wurde.

        Ergo: Der bessere Tipp ist, jeden Ergebniswert in einer eigenen Zeile zu notieren, dann ist "AS oder nicht" nicht mehr so wichtig.

        Es wäre auch noch möglich, Bezeichner von Aliasnamen durch unterschiedliche Begrenzungszeichen voneinander zu unterscheiden. Abgesehen vom ANSI-Kompatibilitätsmodus werden unter MySQL Bezeichner mit Backticks eingefasst. Bei der Definition eines Aliasnamens ist ein solcher aber noch kein Bezeichner, weswegen er auch in 'String'-"Begrenzern" notiert werden kann. Andere Systeme erkennen Aliasnamen in Bezeichnerbegrenzern sogar als syntaktischen Fehler an.

        Lo!

  2. Moin!

    Bestimme das wenn Du die Abfrage baust, 'AS' löst Dein Problem:

    SELECT  
      `kunden.id` AS `kunden_id`,  
      `vertraege.id` AS `vertraege_id`  
    FROM  
      `kunden`,  
      `vertraege`
    

    MFFG (Mit freundlich- friedfertigem Grinsen)

    fastix

    1. Moin!

      SELECT  
        `kunden`.`id`    AS `kunden_id`,  
        `vertraege`.`id` AS `vertraege_id`  
      FROM  
        `kunden`,  
        `vertraege`
      

      natürlich.

      MFFG (Mit freundlich- friedfertigem Grinsen)

      fastix

  3. Hi!

    per mysql_query rufe ich bestimmte Spalten aus zwei verschiedenen Tabellen ab.
    Wenn ich nun per
    while ($row = mysql_fetch_assoc($result))
    echo $row[tabelle_a.id];
    die id der Einträge aus der ersten Tabelle abrufen möchte, funktioniert das nicht.

    Einfach irgendwas zu probieren führt zwar gemäß dem Infinite Monkey Theorem auch irgendwann zum Ziel, doch das kann dauern.

    Wenn dort stattdessen nur
    echo $row[id];
    steht geht das einwandfrei, aber leider kann ich dann nunmal nicht bestimmen aus welcher der beiden Tabellen die id abgerufen werden soll.

    Mit einem Array-Zugriff - also dem Zugriff auf den Inhalt von $row - kannst du nicht rückwirkend das Ergebnis der Abfrage ändern. Hier kannst du nur noch auf das zugreifen, was da ist. Und wenn du nicht weißt, was da ist, mach eine Kontrollausgabe: var_dump($row) oder print_r($row). Mit der erkennst du, welche Schlüssel vorhanden sind.

    Wie muss $row[tabelle_a.id] demnach richtig lauten? Muss ich evtl. den Punkt maskieren?

    Nachdem du weißt, was tatsächlich vorhanden ist, solltest du dir die Grundlagen des Arrayzugriffs aneigenen, besonders: Why is $foo[bar] wrong?. Des weiteren ist es sehr empfehlenswert, beim Programmieren das error_reporting auf E_ALL (und display_errors auf on) zu stellen, damit du für solche Fehler eine Notice-Meldung angezeigt bekommst.

    Wenn nun die Spaltennamen nicht nach deinem Geschmack sind, oder sie sich gegenseitig überschreiben, kannst du auch den Tipp mit den Alias-Namen beachten, um eine Eindeutigkeit zu gewährleisten.

    Lo!