Ankündigung

Einklappen
Keine Ankündigung bisher.

Drei Tabellen verknüpfen und ausgeben was NICHT vohanden ist.

Einklappen

Neue Werbung 2019

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

  • Drei Tabellen verknüpfen und ausgeben was NICHT vohanden ist.

    Hallo!

    Wie fange ich an... Mein Problem ist, bei einer Verknüfung von drei Tabellen IDs auszulesen, die nicht vorhanden sind. Aber erstmal die Tabellen:

    A: user
    id, name, typ

    B: post
    id, topic, ..., typ

    C: likes
    id, userid, postid

    Nun will ich wissen, wer hat bei welchem Post noch kein Like gesetzt. Mein aktueller Stand sieht etwa so aus:

    Code:
    SELECT
        *
    FROM likes l
    RIGHT OUTER JOIN
    	post p				
    	ON l.postid= p.id
    JOIN
    	user u
    	ON l.userid = u.id
    WHERE
    	u.type = '{$_POST['utype']}'
    	AND
    	p.type = '{$_POST['ptype']}'
    Ich bin jetzt so weit, dass ich es mit zwei Arrays machen will, die ich dann in PHP vergleiche Trotzdem würde ich gerne wissen, ob es auch mit MySQL gehen würde. Bin gespannt

    Viele Grüße!

  • #2
    Left join

    Kommentar


    • #3
      Zwei mal? Hab ich probiert, Ergebnis ist 0. Da aber in likes noch nichts, user und posts aber gefüllt ist, müsste ich jede Menge Einträge zurückerhalten.

      Kommentar


      • #4
        Wie hast du es denn probiert?

        Richtig wäre post LEFT JOIN likes mit WHERE likes.id IS NULL

        Kommentar


        • #5
          Das ist auch logischer Unfug. Mach mal die Where-Bedingung wg und schau dir an, wie die Ergebnismenge mit LEFT JOIN ausschaut.
          In der Kürze:
          Code:
          SELECT * FROM
          a LEFT JOIN B
          ON a.a_id=b.a_id
          WHERE b.type = 17 OR b.type IS NULL

          Kommentar


          • #6
            Code:
            SELECT
                *
            FROM likes l
            LEFT OUTER JOIN
            	post p				
            	ON l.postid= p.id
            LEFT OUTER  JOIN
            	user u
            	ON l.userid = u.id
            Ergibt auch 0. Ebenso wenn ich OUTER weg lasse, was aber keinen Unterschied machen dürfte, wenn ich mich recht erinnere.

            Die Sache mit IS NULL funktioniert. Aber nur deshalb, weil nichts in der Datenbank ist. Sobald Post 4 von User 3 geliked ist, taucht Post 4 nicht mehr im Ergebnis auf, obwohl er von User 1 und 2 noch nicht geliked wurde. Oder?

            Nochmal ganz kurz: Ich will eine Liste mit all denen Kombinationen aus PostID und UserID die NICHT in likes vorkommen, wobei nur bestimmte Posts und User in die Auswertung einfliesen dürfen. Nicht das wir uns falsch verstehen, mein Kollege hier hat auch etwas gebraucht bis er verstanden hat, was ich will

            Kommentar


            • #7
              Zitat von superheld Beitrag anzeigen
              Hallo!

              Wie fange ich an... Mein Problem ist, bei einer Verknüfung von drei Tabellen IDs auszulesen, die nicht vorhanden sind. Aber erstmal die Tabellen:

              A: user
              id, name, typ

              B: post
              id, topic, ..., typ

              C: likes
              id, userid, postid

              Nun will ich wissen, wer hat bei welchem Post noch kein Like gesetzt. Mein aktueller Stand sieht etwa so aus:

              Code:
              SELECT
                  *
              FROM likes l
              RIGHT OUTER JOIN
              	post p				
              	ON l.postid= p.id
              JOIN
              	user u
              	ON l.userid = u.id
              WHERE
              	u.type = '{$_POST['utype']}'
              	AND
              	p.type = '{$_POST['ptype']}'
              Ich bin jetzt so weit, dass ich es mit zwei Arrays machen will, die ich dann in PHP vergleiche Trotzdem würde ich gerne wissen, ob es auch mit MySQL gehen würde. Bin gespannt

              Viele Grüße!

              Code:
              test=*# select * from t_user;
               id
              ----
                1
                2
                3
              (3 rows)
              
              Time: 0,230 ms
              test=*# select * from t_post;
               id
              ----
                1
                2
                3
              (3 rows)
              
              Time: 0,218 ms
              test=*# select * from likes;
               id | u_id | p_id
              ----+------+------
                1 |    2 |    3
                2 |    1 |    2
              (2 rows)
              
              Time: 0,215 ms
              test=*# select u.id, p.id from t_user u cross join t_post p except select u_id, p_id from likes;
               id | id
              ----+----
                1 |  1
                1 |  3
                2 |  1
                2 |  2
                3 |  1
                3 |  2
                3 |  3
              (7 rows)
              Achtung: da ist ein cross - join, bei vielen usern/posts könnte das ausarten.


              Andreas

              Kommentar


              • #8
                SELECT
                *
                SInnvollerweise gibt man hier an, welche Felder aus welchen Tabellen man benötigt.

                Kommentar


                • #9
                  Zitat von nikosch Beitrag anzeigen
                  SInnvollerweise gibt man hier an, welche Felder aus welchen Tabellen man benötigt.
                  Ja. In diesem Falle wollte ich aber mit einem befehl Struktur und Inhalt der Tabelle zeigen. Das hier war eine Demo, kein produktiver Code.


                  Andreas

                  Kommentar


                  • #10
                    Ich meinte den SUperhelden

                    Kommentar


                    • #11
                      Zitat von nikosch Beitrag anzeigen
                      Ich meinte den SUperhelden
                      Ahhh...


                      Andreas

                      Kommentar


                      • #12
                        Zitat von superheld Beitrag anzeigen
                        Nochmal ganz kurz: Ich will eine Liste mit all denen Kombinationen aus PostID und UserID die NICHT in likes vorkommen, wobei nur bestimmte Posts und User in die Auswertung einfliesen dürfen. Nicht das wir uns falsch verstehen, mein Kollege hier hat auch etwas gebraucht bis er verstanden hat, was ich will
                        Ajo, dann haben wohll einige was durcheinander geworfen und Nikosch ist schuld, weil er mit left join angefangen hat.
                        also:
                        "likes right join post join user"
                        oder "post join user left join likes"
                        das sollte eigentlich tun. Wenn ni8cht, sind deine Daten Schrott.
                        Vielleicht hilft es, wenn du mal Beispieldaten postest.

                        Kommentar


                        • #13
                          Zitat von nikosch Beitrag anzeigen
                          Ich meinte den SUperhelden
                          Bei mir das selbe. Habe mit eine Tabelle geschrieben, die mir erstmal alles auswirft, was MySQL zu zurück gibt. Das wird für den Einsatz dann auch noch selektiert werden.

                          Kommentar


                          • #14
                            Zitat von akretschmer Beitrag anzeigen
                            Code:
                            test=*# select u.id, p.id from t_user u cross join t_post p except select u_id, p_id from likes;
                             id | id
                            ----+----
                              1 |  1
                              1 |  3
                              2 |  1
                              2 |  2
                              3 |  1
                              3 |  2
                              3 |  3
                            (7 rows)
                            Hallo Andreas. Die Abfrage sieht sehr gut aus. Allerdings bringt mir der Test in PHPMyAdmin einen Fehler: #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 'EXCEPT SELECT postid, userid FROM likes LIMIT 0, 30' at line 6.

                            Kommentar


                            • #15
                              Zitat von superheld Beitrag anzeigen
                              Hallo Andreas. Die Abfrage sieht sehr gut aus. Allerdings bringt mir der Test in PHPMyAdmin einen Fehler: #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 'EXCEPT SELECT postid, userid FROM likes LIMIT 0, 30' at line 6.
                              Mag sein. Ich verwende PostgreSQL, möglicherweise verstehen aktuelle MySQL-Versionen diese Dinge des SQL-Standards noch nicht ... kann man sicherlich umschreiben in einen JOIN, überlasse ich Dir mal zur Übung

                              Oder Du wechselst halt zu PG.

                              Andreas

                              Kommentar

                              Lädt...
                              X