tommi: abfrage von zwei tabellen & ersetzen

hallo!

ich habe zwei tabellen (comments und user). in der tabelle comments steht die id von dem user, der den kommentar verfasst hat. die gleiche findet sich auch in der tabelle user. nun würde ich gerne eine abfrage machen, dass alle kommentare ausgibt, jedoch die jeweilige id der tabelle comments durch den namen zu dieser id in der tabelle user ersetzen.
ist das möglich???? ich mache das mit mysql!

schönen tag,

tommi

  1. Hallo tommi,

    klar geht das!

    name ist der name in der user-tabelle; title, comment und date sind aus der comments-tabelle (ersetz es wie du es brauchst, aber möglichst nicht *)

    SELECT name, title, comment, date FROM comments LEFT JOIN user USING(id) [where_definitions] [SORT BY date DESC];

    Gruß, Marian

    1. yo,

      SELECT name, title, comment, date FROM comments LEFT JOIN user USING(id) [where_definitions] [SORT BY date DESC];

      wenn man hier schon einen LEFT JOIN einsetzt, dann aber eher umgekehrt, sprich user LEFT JOIN comments.....

      Ilja

      1. hi!

        SELECT name, title, comment, date FROM comments LEFT JOIN user USING(id) [where_definitions] [SORT BY date DESC];

        wenn man hier schon einen LEFT JOIN einsetzt, dann aber eher umgekehrt, sprich user LEFT JOIN comments.....

        wie kann man das denn anders machen?? und könnte mir jemand erklären, was diese left join jetzt genau macht? thx!

      2. echo $begrüßung;

        yo,

        SELECT name, title, comment, date FROM comments LEFT JOIN user USING(id) [where_definitions] [SORT BY date DESC];

        wenn man hier schon einen LEFT JOIN einsetzt, dann aber eher umgekehrt, sprich user LEFT JOIN comments.....

        Wieso? Er wollte doch alle Kommentare und dazu den Usernamen haben. Das war schon richtig so 'rum.

        echo "$verabschiedung $name";

        1. yo,

          Wieso? Er wollte doch alle Kommentare und dazu den Usernamen haben. Das war schon richtig so 'rum.

          nein, dann benutzt man wirklich einen INNER JOIN, weil es keine comments geben solle, ohne einen user zuordnen zu können. dann wäre die datenbank in einen inkonsistenten zustand. LEFT JOIN macht nur umgekehrt sinn, sprich user zuerst, da es user ohne comments geben kann, aber keine comments ohne user.

          Ilja

      3. Hallo Ilja

        SELECT name, title, comment, date FROM comments LEFT JOIN user USING(id) [where_definitions] [SORT BY date DESC];

        wenn man hier schon einen LEFT JOIN einsetzt, dann aber eher umgekehrt, sprich user LEFT JOIN comments.....

        Noch besser gar keinen OUTER sondern einen INNER JOIN. Schließlich sollte jeder Kommentar einen Benutzer haben, der ihn verfaßt hat.

        Freundliche Grüße

        Vinzenz

        1. echo $begrüßung;

          Noch besser gar keinen OUTER sondern einen INNER JOIN. Schließlich sollte jeder Kommentar einen Benutzer haben, der ihn verfaßt hat.

          Das stimmt schon, aber welchen Nachteil hat es denn, wenn man hier einen OUTER JOIN verwendet?

          echo "$verabschiedung $name";

          1. Hallo dedlfix

            Das stimmt schon, aber welchen Nachteil hat es denn, wenn man hier einen OUTER JOIN verwendet?

            Keinen, das Ergebnis sollte gleich sein.

            Freundliche Grüße

            Vinzenz

            1. yo,

              Keinen, das Ergebnis sollte gleich sein.

              nein, ist es nicht. es kann user geben, die keinen comment gemacht haben. je nachdem ob er diese mit im boot haben will oder nicht muss man über einen outer join oder inner gehen. aber das ergebnis eines inner und outer kann durchaus unterschiedlich sein.

              Ilja

              1. Hallo Ilja

                Keinen, das Ergebnis sollte gleich sein.

                nein, ist es nicht. es kann user geben, die keinen comment gemacht haben. je nachdem ob er diese mit im boot haben will oder nicht muss man über einen outer join oder inner gehen. aber das ergebnis eines inner und outer kann durchaus unterschiedlich sein.

                Selbstverständlich kann das Ergebnis eines INNER JOIN und des OUTER JOIN unterschiedlich sein (und ist es in vielen Fällen).

                Ich bezog mich in meiner Antwort auf die Frage von dedlfix auf den angebrachten

                  
                comments LEFT OUTER JOIN users  
                
                

                Dieser sollte gemäß meiner Argumentation, dass jeder Kommentar einen Benutzer haben sollte, der diesen Kommentar verfasst hat, das gleiche Ergebnis liefern wie

                  
                users INNER JOIN comments  
                
                

                Dem Ausgangsposter ging es explizit um die Ausgabe von Kommentaren inklusive Benutzernamen, nicht um die Benutzer und die Kommentare, die sie gegebenenfalls verfaßt haben.

                Für den letzten Fall ist es auf jeden Fall anzunehmen, dass es Benutzer gibt, die noch keinen Kommentar verfaßt haben. Somit sollte, wie Du richtig angemerkt hast, der LEFT OUTER JOIN eine andere (größere) Ergebnismenge liefern als der INNER JOIN.

                Freundliche Grüße

                Vinzenz

                PS: Ja, ich hatte vielleicht zuviel gekürzt, zuwenig zitiert :-)

        2. Hi,

          SELECT name, title, comment, date FROM comments LEFT JOIN user USING(id) [where_definitions] [SORT BY date DESC];
          wenn man hier schon einen LEFT JOIN einsetzt, dann aber eher umgekehrt, sprich user LEFT JOIN comments.....
          Noch besser gar keinen OUTER sondern einen INNER JOIN. Schließlich sollte jeder Kommentar einen Benutzer haben, der ihn verfaßt hat.

          Szenario:
          User meldet sich an, schreibt einen Kommentar und löscht danach seinen User-Account.
          Der Kommentar existiert u.U. noch, der User nicht mehr.

          cu,
          Andreas

          --
          Warum nennt sich Andreas hier MudGuard?
          Schreinerei Waechter
          Fachfragen per E-Mail halte ich für unverschämt und werde entsprechende E-Mails nicht beantworten. Für Fachfragen ist das Forum da.
          1. yo,

            Szenario:
            User meldet sich an, schreibt einen Kommentar und löscht danach seinen User-Account.
            Der Kommentar existiert u.U. noch, der User nicht mehr.

            diese inkonsistenz sollte aber nicht die abfrage abfangen, sondern enteder werden die comments mitgelöscht (fremdschlüssel) oder aber der datensatz des users nicht wirklich gelöscht, sondern nur auf inaktiv gesetzt. dann kann solch ein szenario nicht eintreten.

            Ilja

          2. Hallo MudGuard

            Szenario:
            User meldet sich an, schreibt einen Kommentar und löscht danach seinen User-Account.
            Der Kommentar existiert u.U. noch, der User nicht mehr.

            Es gibt verschiedene Lösungsmöglichkeiten für dieses Problem. Ilja hat bereits zwei aufgezählt. Ich persönlich bin der Ansicht, ein Kommentar ohne Benutzerangabe  ist auf jeden Fall zu vermeiden.

            Wie man dies macht, bleibt dem Entwickler der Anwendung überlassen :-) Mein Favorit wäre der "deaktivierte Benutzer", d.h. kein Löschen, sondern Setzen eines Löschflags. Sicherlich wirft dies weitere Probleme auf, z.B. kann dieser Benutzername erneut vergeben werden oder nicht ...

            Freundliche Grüße

            Vinzenz

      4. Hi,

        SELECT name, title, comment, date FROM comments LEFT JOIN user USING(id) [where_definitions] [SORT BY date DESC];
        wenn man hier schon einen LEFT JOIN einsetzt, dann aber eher umgekehrt, sprich user LEFT JOIN comments.....

        Hm.
        Also ich seh das so:
        Ausgegeben werden sollen alle Kommentare ==> FROM comments

        Zu jedem Kommentar sollen noch Informationen aus der User-Tabelle ausgegeben werden ==> LEFT JOIN/INNER JOIN auf die Userdaten. *)
        (INNER JOIN dann, wenn beim Löschen eines User-Datensatzes alle Kommentare des Users auch gelöscht werden, sonst LEFT JOIN)

        cu,
        Andreas

        --
        Warum nennt sich Andreas hier MudGuard?
        Schreinerei Waechter
        Fachfragen per E-Mail halte ich für unverschämt und werde entsprechende E-Mails nicht beantworten. Für Fachfragen ist das Forum da.
      5. Hi Ilja,

        wenn man hier schon einen LEFT JOIN einsetzt, dann aber eher umgekehrt, sprich user LEFT JOIN comments.....

        erstens will ich alle comments und den user dazu, nicht alle user mit ihren comments, und zweitens gibt es user, die keinen comment schreiben.

        Gruß, Marian

        1. yo,

          erstens will ich alle comments und den user dazu, nicht alle user mit ihren comments, und zweitens gibt es user, die keinen comment schreiben.

          ok, dann gehe deinen gedanken doch noch mal weiter. es gibt user ohne comments, aber gibt es comments ohne user ? denn nur dann würde dein LEFT JOIN in deiner reihenfolge sinn machen, anonsten kann auch ein IMMER JOIN herhalten. deswegen meine anregung, wenn schon ein LEFT JOIN gewünscht ist, dann bitte auch in der richtigen reihenfolge.

          Ilja

  2. Hallo tommi

    ich habe zwei tabellen (comments und user). in der tabelle comments steht die id von dem user, der den kommentar verfasst hat. die gleiche findet sich auch in der tabelle user. nun würde ich gerne eine abfrage machen, dass alle kommentare ausgibt, jedoch die jeweilige id der tabelle comments durch den namen zu dieser id in der tabelle user ersetzen.

    Du suchst den (INNER) JOIN.

    ist das möglich???? ich mache das mit mysql!

    Ja:

      
    SELECT  
        c.comments,  
        u.user  
    FROM comments AS c  
    INNER JOIN user AS u  
    ON c.id = u.id  
    
    

    wenn 'id' die id des users in beiden Tabellen angibt, der Name in der Spalte user und der Kommentar in der Spalte comments steht.

    JOINs sind sehr nützlich, Du solltest Dich mit den verschiedenen Arten beschäftigen.

    Freundliche Grüße

    Vinzenz