[SQL allgemein] SQL-Abfrage über 3 Tabellen mit JOINs

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

  • [SQL allgemein] SQL-Abfrage über 3 Tabellen mit JOINs

    Hallo zusammen,

    ich habe ein Problem mit einer Abfrage. Folgendes Szenario liegt vor:

    Tabelle A

    benutzerid
    benutzername

    Tabelle B

    benutzerid
    emailadresse

    Tabelle C

    benutzerid
    fotoid
    typ (SET: album, profil)

    Ich möchte nun alle Datensätze aus Tabelle A und B die mit der benutzerid übereinstimmen. Auch möchte
    ich das ich dann aus der Tabelle C die fotoid's bekomme wo der typ als SET = profil ist.

    Folgende SQL habe ich momentan:


    PHP-Code:
    SELECT 

    a
    .fotoidb.benutzeridb.benutzername

    FROM Tabelle_C 
    AS 

       RIGHT JOIN Tabelle_A 
    AS b

    ON a
    .benutzerid b.benutzerid

       INNER JOIN Tabelle_B 
    AS c

    ON b
    .benutzerid c.benutzerid 

    WHERE 
    (a.fotoid IS NULL OR FIND_IN_SET('profil'a.typ) > 0
    Allerdings funktioniert das ganze nicht, wenn jemand mehrere Fotos hat (also wo typ (SET=album) oder ähnliches).

    Weiss jemand Rat ob sowas in einer SQL zu regeln ist?

    Denkanstoß vielleicht?

    Grüße,

    Marvin
    Zuletzt geändert von marvin.s; 18.11.2006, 21:36.

  • #2
    Select
    Tab 3
    join tab 2 using benutzer_id
    join tab 1 using benutzer_id
    Where
    uning benutzer_id = x
    and tab3.typ = profil

    fettisch.

    Warum arbeitest du mit Find_in_set

    Kommentar


    • #3
      Weil die Spalte typ vom TYP SET ist.. Mit den Werten 'album','profil' usw.

      P.S.: Die Abfrage funzt trotzdem nicht..

      Vielleicht nochmal zum Verständnis:

      Tabelle USER

      benutzerid
      benutzername

      Tabelle USERDATA

      benutzerid
      emailadresse

      Tabelle FOTOS

      benutzerid
      fotoid
      extension
      typ

      Die Spalte "typ" in der Tabelle "FOTOS" ist vom TYP ein SET mit den Werten "profil", "album", "ecard" um die Fotos mehrfach verwenden zu können.

      Das heisst ein Foto kann als "profil" und als "ecard" markiert sein. UND zu jedem User kann es mehrere Fotos geben, allerdings nur EINS mit dem Typ "profil" oder halt keins. Jetzt möchte ich die kompletten Userdaten (aus USER und USERDATA) und das Foto zum jeweiligen User haben das den Typ "profil" hat. Wenn ein User kein Foto mit dem Typ "profil" hat soll der User trotzdem ausgegeben werden.
      Zuletzt geändert von marvin.s; 18.11.2006, 17:21.

      Kommentar


      • #4
        zeig mal bitte eine zeile aus der Bildtabelle.

        Kommentar


        • #5
          benutzerid - fotoid - extension - typ

          1 - 3 - jpg - profil,album
          1 - 5 - jpg - album
          2 - 6 - jpg - album



          Jeder Benutzer kann mehrere Fotos haben die als mehrere Typen markiert sind (halt in der SET-Spalte). Allerdings kann ein Benutzer auch kein Foto haben oder nur ein Foto mit dem Typ "profil".

          Ich möchte alle User haben, egal ob sie ein Foto in der Tabelle haben, das allerdings mit dem Typ "profil" markiert ist, oder nicht.

          Die beiden User-Tabellen mit INNER JOIN zu verbinden ist klar. Wie macht man aber den Rest? Geht das überhaupt?!

          Kommentar


          • #6
            ah, jetzt verstehe ich.

            jetzt brächte ich nochmal ne konkrete äußerung, was dein problem ist.

            Kommentar


            • #7
              Wenn ich, so wie im ersten Posting beschrieben, die Abfrage ausführe und ein User ein oder mehrere Fotos mit "album" aber nicht mit "profil" markiert hat, dann wird er nicht selektiert.

              Kommentar


              • #8
                zeig mal beispieldaten zu dem konkreten fall.

                Kommentar


                • #9
                  PHP-Code:
                  CREATE TABLE `user` (
                    `
                  benutzeridint(11NOT NULL auto_increment,
                    `
                  benutzernamevarchar(255NOT NULL default '',
                    
                  PRIMARY KEY  (`benutzerid`)
                  ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=;


                  INSERT INTO `user` (`benutzerid`, `benutzername`) VALUES (1'papa');
                  INSERT INTO `user` (`benutzerid`, `benutzername`) VALUES (3'mama');

                  CREATE TABLE `userdata` (
                    `
                  benutzeridint(11NOT NULL default '0',
                    `
                  emailadressevarchar(255NOT NULL default '',
                    
                  PRIMARY KEY  (`benutzerid`)
                  ENGINE=MyISAM DEFAULT CHARSET=latin1;


                  INSERT INTO `userdata` (`benutzerid`, `emailadresse`) VALUES (1'papa@test.de');
                  INSERT INTO `userdata` (`benutzerid`, `emailadresse`) VALUES (3'mama@test.de');


                  CREATE TABLE `fotos` (
                    `
                  fotoidint(11NOT NULL auto_increment,
                    `
                  benutzeridint(11NOT NULL default '0',
                    `
                  extensionchar(3NOT NULL default '',
                    `
                  typset('profil','album','ecard'NOT NULL default '',
                    
                  PRIMARY KEY  (`fotoid`)
                  ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=43 ;



                  INSERT INTO `fotos` (`fotoid`, `benutzerid`, `extension`, `typ`) VALUES (281'jpg''album');
                  INSERT INTO `fotos` (`fotoid`, `benutzerid`, `extension`, `typ`) VALUES (371'jpg''profil');
                  INSERT INTO `fotos` (`fotoid`, `benutzerid`, `extension`, `typ`) VALUES (423'jpg''album'); 

                  So, für die Tabellen habe ich auch mal den Create-Befehl eingebaut

                  Kommentar


                  • #10
                    und was soll rauskommen?

                    Kommentar


                    • #11
                      Also mit folgender SQL bekomme ich nachfolgendes Ergebnis:

                      PHP-Code:
                      SELECT 

                      a
                      .fotoidb.benutzeridb.benutzername

                      FROM fotos 
                      AS 

                         RIGHT JOIN user 
                      AS b

                      ON a
                      .benutzerid b.benutzerid

                         INNER JOIN userdata 
                      AS c

                      ON b
                      .benutzerid c.benutzerid 

                      WHERE 
                      (a.fotoid IS NULL OR FIND_IN_SET('profil'a.typ) > 0
                      Code:
                       fotoid  	 benutzerid  	 benutzername
                      37 	1 	papa
                      Ich möchte aber folgendes bekommen:

                      Code:
                       fotoid  	 benutzerid  	 benutzername
                      37 	1 	papa
                       fotoid  	 benutzerid  	 benutzername
                      NULL 	3 	mama

                      Kommentar


                      • #12
                        dann musst du mit der benutzertabelle anfangen.
                        left join auf die benutzerdaten
                        und dann die fotos.

                        Kommentar


                        • #13
                          Das habe ich ebenfalls schon versucht

                          Hat aber nicht funktioniert..

                          Du kannst mich aber gerne belehren wenn Du es hinbekommst.. Ich habe schon soviele Kombinationen ausprobiert, ich weiss gar net mehr wo mir der Kopf steht.

                          P.S.: Ok mit dieser Abfrage funktioniert es teilweise:

                          PHP-Code:
                          select from user as a left join userdata as b on a.benutzerid b.benutzerid left join fotos as c on a.benutzerid b.benutzerid where FIND_IN_SET('profil'c.typ) > 
                          Geht es jetzt auch noch das man bei fotoid NULL stehen hat wenn kein Foto vorhanden? Momentan steht da ja die fotoid von dem ersten user
                          Zuletzt geändert von marvin.s; 18.11.2006, 21:53.

                          Kommentar


                          • #14
                            Original geschrieben von marvin.s
                            Geht es jetzt auch noch das man bei fotoid NULL stehen hat wenn kein Foto vorhanden? Momentan steht da ja die fotoid von dem ersten user
                            Weil du nirgends eine Join-Bedingung für die Tabelle mit dem Alias C angegeben hast!

                            Ein netter Guide zum übersichtlichen Schreiben von PHP/MySQL-Code!

                            bei Klammersetzung bevorzuge ich jedoch die JavaCoding-Standards
                            Wie man Fragen richtig stellt

                            Kommentar


                            • #15
                              Ähm, wenn ich folgende SQLs nehme bekomme ich wieder nur den einen Datensatz:

                              PHP-Code:
                              select from user as a left join userdata as b on a.benutzerid b.benutzerid left join fotos as c on b.benutzerid c.benutzerid where FIND_IN_SET('profil'c.typ) > 0

                              select 
                              from user as a left join userdata as b on a.benutzerid b.benutzerid left join fotos as c on a.benutzerid c.benutzerid where FIND_IN_SET('profil'c.typ) > 
                              Oder bin ich jez doof?

                              Kommentar

                              Lädt...
                              X