juergen: abfrage aus 2 tabellen

hallo ich habe 2 sql abfragen die auch einzeln funktionieren:
1)SELECT total, einzeln, datum FROM termine WHERE ID_Geraete = '$ID' ORDER BY datum
2)SELECT Standort, ID_Golfclub, Datum FROM Verlauf WHERE ID_Geraete = '$ID' ORDER BY datum
nun will ich aber das die beiden Ergenisse in einer ausgabe nach dem datum sortiert angezeigt werden.
bei dieser sql abfrage:
3)SELECT total, einzeln, datum, Standort, ID_Golfclub, Datum FROM termine , Verlauf WHERE ID_Geraete = '$ID' ORDER BY datum
kommt folgende fehlermeldung:
#1052 - Column 'datum' in field list is ambiguous

Ich habe bisher noch nie mit abfragen aus/über 2 tabellen gearbeitet.
Wo liegt der fehler? danke für tipps
Jürgen

  1. Hallo

    3)SELECT total, einzeln, datum, Standort, ID_Golfclub, Datum FROM termine , Verlauf WHERE ID_Geraete = '$ID' ORDER BY datum

    SELECT  
        total,  
        einzeln,  
        datum,  
        Standort,  
        ID_Golfclub,  
        Datum  
    FROM termine t          -- Tabellenalias für faule Schreiber  
    INNER JOIN Verlauf v    -- explizite Join-Syntax  
    ON t.ID_Geraete = v.ID_Geraete   -- die Aliasnamen im Einsatz,  
                            -- sie sagen der Datenbank, aus welcher Tabelle  
                            -- die Felder stammen  
    ORDER BY Datum
    

    kommt folgende fehlermeldung:
    #1052 - Column 'datum' in field list is ambiguous

    Mit der Schreibweise Tabellenname.Spaltenname löst Du diesen Zwiespalt auf, in dem das Datenbankmanagementsystem steckt.

    Ich habe bisher noch nie mit abfragen aus/über 2 tabellen gearbeitet.

    Lesetipp: Rouven Thimms "Einführung Joins".

    Kommst Du an drei Tabellen, dann hat SELFHTML aktuell auch einen Artikel dafür: Fortgeschrittene Jointechniken.

    Freundliche Grüße

    Vinzenz

    1. kommt folgende fehlermeldung:
      #1052 - Column 'datum' in field list is ambiguous

      Mit der Schreibweise Tabellenname.Spaltenname löst Du diesen Zwiespalt auf, in dem das Datenbankmanagementsystem steckt.

      Nebend er von Vinnie genannten Syntax "für faule Schreiber" empfiehlt der Hamster die Nutzung datenbankweit eindeutiger Datenfeldnamen, und zwar über Prasefices, z.B.:

      Tabellenname:
      Tiere
      Datenfelder:
      Tiere_ID
      Tiere_Name
      Tiere_Geburtsdatum
      Tiere_Rasse

      Auch da gleich ein interessanter Aspekt, manche meinen, dass es doch Tier_ID, Tier_Name etc. heissen müsste. Der Hamster hält das 1.) für nicht folgerichtig und 2.) für problematisch, bspw. bei Tabellennamen wie User oder Benutzer (yo, der Hamster weiss, hardliner kommen da mit Users und Benutzers - LOL).

      Ein weites Feld.

    2. Hallo,
      leider kommt ne  neue fehlermeldung:

      1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'FROM termine  INNER JOIN Verlauf  ON termine . ID_Geraete = Verlauf . ID_Geraete' at line 1

      bei deinem sql:
      SELECT
          total,
          einzeln,
          datum,
          Standort,
          ID_Golfclub,
       FROM termine
       INNER JOIN Verlauf
       ON termine.ID_Geraete = Verlauf.ID_Geraete
      ORDER BY datum

      Bin gerade beim artikel durchlesen aber falls du mir weiterhelfen kannst.
      mfg juergen

      1. Hallo Jürgen

        1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'FROM termine  INNER JOIN Verlauf  ON termine . ID_Geraete = Verlauf . ID_Geraete' at line 1

        bei deinem sql:

        Nein, dieser Fehler ist in meinem SQL nicht enthalten, der stammt von Dir :-)

        SELECT
            total,
            einzeln,
            datum,
            Standort,
            ID_Golfclub,
        FROM termine
        INNER JOIN Verlauf
        ON termine.ID_Geraete = Verlauf.ID_Geraete

        termine . ID_Geraete = Verlauf . ID_Geraete

        Fatale Leerzeichen!
        Ich schrieb nicht umsonst

        Mit der Schreibweise Tabellenname.Spaltenname löst Du diesen Zwiespalt auf, in dem das Datenbankmanagementsystem steckt.

        Freundliche Grüße

        Vinzenz

        1. Hallo vincenz

          termine . ID_Geraete = Verlauf . ID_Geraete

          Fatale Leerzeichen!

          erstmal danke, aber so mit leerzeichen kommt leider noch die gleiche fehlermeldung?
          Danke juergen

          1. termine . ID_Geraete = Verlauf . ID_Geraete

            Fatale Leerzeichen!
            erstmal danke, aber so mit leerzeichen kommt leider noch die gleiche fehlermeldung?

            Da war Vinnie auf dem falschen Dampfer, Du hast irgendwo ein Komma zuviel.

            1. Hallo Hamstar,

              Da war Vinnie auf dem falschen Dampfer, Du hast irgendwo ein Komma zuviel.

              stimmt. Aber nicht in meinem Code :-)
              Das ist das Risiko beim Löschen der letzten Spalte, dennoch finde ich die Schreibweise, die Kalle hier einmal vorgestellt hat (Komma zu Beginn einer Zeile), einfach nur häßlich.

              Freundliche Grüße

              Vinzenz

              1. Das ist das Risiko beim Löschen der letzten Spalte, dennoch finde ich die Schreibweise, die Kalle hier einmal vorgestellt hat (Komma zu Beginn einer Zeile), einfach nur häßlich.

                Sowas:
                "
                SELECT
                    total,
                    einzeln,
                    datum,
                    Standort,
                    ID_Golfclub,
                FROM termine
                INNER JOIN Verlauf
                ON termine.ID_Geraete = Verlauf.ID_Geraete
                "

                sollte aber auch durch sowas:
                "
                SELECT
                    total,
                    einzeln,
                    datum,
                    Standort,
                    ID_Golfclub
                FROM
                    termine
                INNER JOIN
                    Verlauf ON (Verlauf.ID_Geraete = termine.ID_Geraete)
                "

                ersetzt werden.   ;)

                Überl auch die wechselnde Gross- und Kleinschreibung. Die verwendeten Namen lasse ich mal unkommentiert.

            2. hallo danke kommafehler gefunden,aber leider problem nicht gelöst

              SELECT total, einzeln, datum, Standort, ID_Golfclub
              FROM termine
              INNER JOIN verlauf ON termine.ID_Geraete = verlauf.ID_Geraete
              ORDER BY datum
              fehlermeldung jetzt wieder

              1052 - Column 'datum' in field list is ambiguous
              ??
              habe mittlerweile beide Feldnamen datum klein geschrieben und frage deshalb nur noch einmal nach datum.
              danke für eure hilfe
              juergen

              1. 1052 - Column 'datum' in field list is ambiguous

                Einfach mal alle Datenfeldnamen in der Schreibweise <Datentabellenname>.<Datenfeldname> angeben.

              2. Hallo

                SELECT total, einzeln, datum, Standort, ID_Golfclub
                FROM termine
                INNER JOIN verlauf ON termine.ID_Geraete = verlauf.ID_Geraete
                ORDER BY datum
                fehlermeldung jetzt wieder

                1052 - Column 'datum' in field list is ambiguous

                Klar, die Spalte "datum" kommt in beiden Tabellen vor. Du musst daher der Datenbank sagen, welche Spalte "datum" Du gerne hättest, die aus der Tabelle termine oder aus der Tabelle verlauf. Dazu gibt es die Schreibweise

                tabellenname.spaltenname

                von mir bereits zweimal erwähnt. Auch in der ORDER-BY-Klausel musst Du die Spalte so spezifizieren. Da es auf Dauer lästig wird, stets voll ausgeschriebene Tabellennamen hinzuschreiben, sind in solchen Fällen kurze und dennoch leicht verständliche Aliasnamen hilfreich.

                Freundliche Grüße

                Vinzenz