Tabellen verknüpfen

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Tabellen verknüpfen

    Guten NAbend,

    In meinem letzten praktikum habe ich mit MS Access arbeiten müssen.
    Dort habe ich die 1-n verbindung etc. kennen gelernt.
    Diese möglichkeit wollte ich in meinem neuen übungs Projekt einbauen.

    Ich weiß nur nicht wirklich wie ich in einer SELECT Abfrage die Tabellen verknüpfen soll.

    Ich habe nur durchs Googeln herrausgefunden das der Befehl was mit "Join" oder "Leave Join" zutun hat.

    PHP-Code:
    $query mysql_query('SELECT
                                        ID,
                                        username
                                    FROM
                                        news
                                    JOIN
                                        newscoment ON
                                        ID.ID_news'

    Als Beispiel habe ich News und die News Kommentare.
    Bei der Tabelle der Kommentare gibt es eine Spalte ID_news.
    In dieser Spalte wird die ID der News gespeichert, um diese zuzuordnen.
    Um diese Auszulesen, habe ich vor die ID der News auf als Suchkriterium in der ID_News Spalte zu benutzen.

    Ich hoffe, ich konnte mein Anliegen gut genug vortragen und hoffe auf aufklärung.

    PS: Ich lese in immer mehr Tutorials, das die EInfühung in MYSQL mit Objekten gemacht wird. Wo liegt dort er Vorteil? Lohnt es sich diese zu lernen oder ist es sicherer beim "alten" Style zu bleiben?

    Gruß Sky
    Leute die Angst vor dem Tod haben, sind Menschen die sich an einen Traum im Leben klammern

  • #2
    Hallo,

    leave join gibt es nicht, aber left join (das hat trotzdem nichts mit verlassen zu tun, sondern mit links/rechts).

    Die on-Klausel ist bei dir unvollständig. Du musst darin im Normalfall die Schlüssel beider Tabellen vergleichen, z. B.
    Code:
    SELECT person.name, telefon.nummer
    FROM person
    LEFT JOIN telefon ON telefon.person_id = person.id
    (Im Beispiel: Tabelle person mit id, name, ... und Tabelle telefon mit id, person_id, nummer.)

    Ich rate zu PDO, weil es sauberer und sicherer ist und sich schöner in eine objektorientierte Projektumgebung einfügt (Ableitung, Exceptions, etc.). Außerdem lässt es sich super leicht umstellen, wenn man plötzlich mal auf ein anderes DBMS als MySQL umstellen muss.

    Gruß,

    Amica
    Zuletzt geändert von AmicaNoctis; 25.10.2010, 20:17. Grund: SQL-Kommandos auf Großschreibung geändert
    [COLOR="DarkSlateGray"]Hast du die [COLOR="DarkSlateGray"]Grundlagen zur Fehlersuche[/color] gelesen? Hast du Code-Tags benutzt?
    Hast du als URL oder Domain-Beispiele example.com, example.net oder example.org benutzt?
    Super, danke!
    [/COLOR]

    Kommentar


    • #3
      Amica entschuldige, aber ich verstehe das nicht!

      Gibt es ein gutes Tutorial dazu?

      Sonst müssten wir eventuell bitte genauer auf die Tabellen Struktur eingehen.

      Sky
      Leute die Angst vor dem Tod haben, sind Menschen die sich an einen Traum im Leben klammern

      Kommentar


      • #4
        Hast du das MySQL Handbuch schon gelesen? Da ist das Thema Joins erklärt. Auch Wikipedia kennt das Thema: Join (SQL) - Wikipedia, the free encyclopedia

        Wenn du trotzdem noch Fragen hast, bitte etwas konkreter werden.
        [COLOR="DarkSlateGray"]Hast du die [COLOR="DarkSlateGray"]Grundlagen zur Fehlersuche[/color] gelesen? Hast du Code-Tags benutzt?
        Hast du als URL oder Domain-Beispiele example.com, example.net oder example.org benutzt?
        Super, danke!
        [/COLOR]

        Kommentar


        • #5
          Genau, diese Seite habe ich auch gelesen. Ich muss zugeben mein Englisch ist noch nicht das beste - vll. schaffe ich nach meinem Wehrdienst es nachzuholen.

          Jedoch...

          Wir haben 2 Tabellen:
          -News:
          -ID
          -titel
          -autor
          -beitrag

          und
          -newscomment:
          ID
          ID_news
          beitrag

          Wenn ich dein im ersten Post geschriebenes richtig verstehe müsste es so sein:
          PHP-Code:
          $query mysql_query('SELECT
                                              ID,
                                              username
                                          FROM
                                              news
                                         LEFT JOIN
                                              newscomment ON
                                              ID.ID_news = ID_news'

          Dennoch verstehe ich die bedeutung nicht! Auch die Erklärung auf dieser Seite unter Anzeigen zu Join verstehe ich nicht. Wo ist da der zusammenhang?
          Vielelicht ist es auch wieder nur der kleine Sprung zum Verständnis!

          Sky
          Leute die Angst vor dem Tod haben, sind Menschen die sich an einen Traum im Leben klammern

          Kommentar


          • #6
            Wie die on-Klausel in deinem Falle jetzt richtig aussehen muss, findest du unten. Da du aber mehrere Tabellen in der Abfrage enthalten hast, solltest du als nächstes die Spaltenreferenzen (zwischen select und from) in der Form tabellenname.spaltenname angeben, da MySQL sonst nicht weiß, welche Spalte (bei gleichnamigen) gemeint ist. In deinem Falle betrifft das vor allem die ID.

            Zur Bedeutung:

            Code:
            SELECT                               -- Ruf die folgenden Spalten
                ID,                              -- 
                username                         -- 
            FROM news                            -- von der Tabelle news
            LEFT JOIN newscomment                -- verbunden mit der Tabelle newscomment ab.
                ON newscomment.ID_news = news.ID -- Kombiniere die beiden Tabellen als Kreuzprodukt* mit der
                                                 -- Einschränkung, dass nur die Elemente verwendet werden, bei
                                                 -- denen die ID_news aus der Tabelle newscomment mit der ID aus
                                                 -- der Tabelle news übereinstimmt.
                                                 -- Wegen des LEFT werden aber auch news aufgenommen, die keine
                                                 -- newscomments haben.
            * Ein Kreuzprodukt ist die Kombination jeder mit jedem, z. B.
            (rot, grün, blau) mit (Blume, Teller, Auto) ergibt im Kreuzprodukt
            (rote Blume, roter Teller, rotes Auto, grüne Blume, grüner Teller, grünes Auto, blaue Blume, blauer Teller, blaues Auto)

            In deinem Falle würde also ohne eine einschränkende on-Klausel jede news mit jedem newscomment kombiniert werden, was natürlich von der gemeinten Logik her falsch wäre.

            Daher musst du einschränken, welche Kombinationen erlaubt sind. Üblicherweise sind das diejenigen, bei denen der Fremdschlüsselwert einer Tabelle gleich dem Primärschlüsselwert der anderen ist. Dadurch ergibt sich obige on-Klausel.
            Zuletzt geändert von AmicaNoctis; 25.10.2010, 23:17.
            [COLOR="DarkSlateGray"]Hast du die [COLOR="DarkSlateGray"]Grundlagen zur Fehlersuche[/color] gelesen? Hast du Code-Tags benutzt?
            Hast du als URL oder Domain-Beispiele example.com, example.net oder example.org benutzt?
            Super, danke!
            [/COLOR]

            Kommentar


            • #7
              Amica, geile erklärung!

              Ich vermute es jetzt kapiert zu haben! Ich werde es Nachmittag versuchen anzuwenden. Danke dir!

              Sky
              Leute die Angst vor dem Tod haben, sind Menschen die sich an einen Traum im Leben klammern

              Kommentar


              • #8
                Hallo,

                Ich habe das Ausprobiert. Es gab auch keine Fehlermeldung mehr, aber er findet immer 0 Einträge. Dann habe ich es auf die alternativen Art gemacht
                PHP-Code:
                $kommentarresult mysql_query('SELECT
                                                            ID,
                                                            beitrag
                                                        FROM
                                                            newskommentar
                                                        WHERE
                                                            ID_news //in welcher Spalte es ausgelesen werden soll
                                                        LIKE
                                                            "'
                .$row['ID'].' "'); //ID Der NEWS als suche benutzen
                        
                $newsbeitrag['kommentarmenge'] = mysql_num_rows($kommentarresult);
                        
                var_dump($newsbeitrag['kommentarmenge']); 
                Die Ausgabe ist int(0) int(0) int(0) int(0) int(0)

                Wo liegt mein denkfehler? Oder habe ich gar einen Fehler gemacht?
                Leute die Angst vor dem Tod haben, sind Menschen die sich an einen Traum im Leben klammern

                Kommentar


                • #9
                  Was daran falsch ist, kann ich nicht erkennen, aber IDs vergleicht man auf keinen Fall mit LIKE, man setzt sie (wenn sie wie meist numerisch sind) auch nicht in Anführungszeichen. Davon abgesehen verwendet man LIKE nie ohne Wildcards, denn dann kann man gleich das schnellere = nehmen.

                  Hast du diese Abfrage einfach mal in PHPMyAdmin ausprobiert? Was passiert dort? Hast du alle Variablen auf deren Inhalt (var_dump) überprüft? Wie ist dein Error-Reporting eingestellt (siehe Forenregeln). Fragst du mit mysql_error() immer brav die Fehlermeldungen der DB ab?
                  [COLOR="DarkSlateGray"]Hast du die [COLOR="DarkSlateGray"]Grundlagen zur Fehlersuche[/color] gelesen? Hast du Code-Tags benutzt?
                  Hast du als URL oder Domain-Beispiele example.com, example.net oder example.org benutzt?
                  Super, danke!
                  [/COLOR]

                  Kommentar


                  • #10
                    Entschuldige, heute war der geburtstag der Großmutter...

                    Also soweit ich dir deine Frage zur findung meines Problems erklären kann:

                    Das Errorreporting ist nach dem Quark aufgebaut.

                    Die Tabellenabfrage habe ich wie im Muster gemacht. Nur das dort noch OR die(....) steht.

                    Ich habe natürlich die Variable $row['ID'] überprüft, diese ist aber korrekt!
                    Kann es mir wirklich nicht erklären selbst mit gut angeheitertemkopf.

                    Gruß Sky
                    Leute die Angst vor dem Tod haben, sind Menschen die sich an einen Traum im Leben klammern

                    Kommentar


                    • #11
                      Erstens kann man auch direkt das entsprechende Kapitel verlinken, so dass deine Helfer sich nicht erst selbst dort durch wühlen müssen.

                      Zweitens ist es genau dieses
                      PHP-Code:
                      or die(mysql_error()) 
                      , das die Fehlermeldungen von der DB abfragt, was du offenbar nicht machst.

                      Falls du noch nicht auf mysql_*-Funktionen festgenagelt bist, rate ich dir sowieso zu PDO und diesem Code:
                      PHP-Code:
                      $pdo = new PDO(/* ... */);
                      $pdo->setAttribute(PDO::ATTR_ERRMODEPDO::ERRMODE_EXCEPTION); 
                      Wenn du wieder nüchtern bist, kannst du ja mal die anderen Fragen beantworten und die Forenregeln lesen, da steht das mit dem "or die()" nämlich auch drin und die sind hier im Forum nicht umsonst Pflichtlektüre
                      [COLOR="DarkSlateGray"]Hast du die [COLOR="DarkSlateGray"]Grundlagen zur Fehlersuche[/color] gelesen? Hast du Code-Tags benutzt?
                      Hast du als URL oder Domain-Beispiele example.com, example.net oder example.org benutzt?
                      Super, danke!
                      [/COLOR]

                      Kommentar


                      • #12
                        Zitat von AmicaNoctis Beitrag anzeigen
                        Wenn du wieder nüchtern bist, kannst du ja mal die anderen Fragen beantworten und die Forenregeln lesen, da steht das mit dem "or die()" nämlich auch drin und die sind hier im Forum nicht umsonst Pflichtlektüre
                        Das ist mir bekannt. ! Das habe ich auch gemacht. Wie in meinem vorherigen Beitrag halb zu lesen ist! Die Datenbank gibt keinen Fehler aus.

                        Du hast aber bereits den Fehler gefunden. Es lag daran, das ich es mit LIKE gemacht habe!
                        Leute die Angst vor dem Tod haben, sind Menschen die sich an einen Traum im Leben klammern

                        Kommentar


                        • #13
                          Zitat von Skywalker077 Beitrag anzeigen
                          Das habe ich auch gemacht. Wie in meinem vorherigen Beitrag halb zu lesen ist!
                          Ok, ich dacht, das hättest du weggelassen, weil du geschrieben hattest:

                          Zitat von Skywalker077 Beitrag anzeigen
                          Nur das dort noch OR die(....) steht.
                          Und, hast du PDO schon angeschaut? Viel besser als die mysql_*-Funktionen, oder?
                          [COLOR="DarkSlateGray"]Hast du die [COLOR="DarkSlateGray"]Grundlagen zur Fehlersuche[/color] gelesen? Hast du Code-Tags benutzt?
                          Hast du als URL oder Domain-Beispiele example.com, example.net oder example.org benutzt?
                          Super, danke!
                          [/COLOR]

                          Kommentar


                          • #14
                            Ja, ich habe mir PDO mir angeschaut und direkt einen Anfall bekommen

                            Da ich mit dem Wiki alleine nicht viel Anfangen konnte habe ich bei Google, mir dieses Tutorial rausgesucht. Ich werde es mir nachdem ich meine Winterreifen drauf gezogen habe mal anschauen. Ich wette das ich dann deine Hilfe wieder brauche =)
                            Leute die Angst vor dem Tod haben, sind Menschen die sich an einen Traum im Leben klammern

                            Kommentar


                            • #15
                              Dieses von dir verlinkte Tutorial würde ich keiner Beachtung würdigen, nachdem ich mal einen kurzen Blick drauf geworfen hab. Davon abgesehen hilft es auch nicht beim Einstieg in PDO an sich, es sorgt nur dafür, dass weitere Generationen von Neulingen glaubt, dass Singletons eine gute Lösung für praktisch alles wären, was wir hier im Forum nicht unterstützen wollen

                              Die Beispiele im Handbuch geben einen recht guten Überblick. Gelesen sollte man die Doku trotzdem mal haben, danach dient sie als Nachschlagewerk. Bei konkreten Fragen einfach die übliche Kette einhalten: Google, Forensuche, neuer Beitrag (bzw. gleich hier im Thread antworten). Ich weiß schon, gegoogelt hast du ja, aber die haben dich irregeführt, weil es keine Einführung in PDO ist, sondern (imho) eine Einführung in schlechte Programmierung, die zufällig PDO benutzt.
                              [COLOR="DarkSlateGray"]Hast du die [COLOR="DarkSlateGray"]Grundlagen zur Fehlersuche[/color] gelesen? Hast du Code-Tags benutzt?
                              Hast du als URL oder Domain-Beispiele example.com, example.net oder example.org benutzt?
                              Super, danke!
                              [/COLOR]

                              Kommentar

                              Lädt...
                              X