[MySQL 4.1] Tabelle mehrfach abfragen

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

  • [MySQL 4.1] Tabelle mehrfach abfragen

    Hallo,

    ich komme mit folgendem Problem trotz intensiver Suche im Forum sowie GOOGLE nicht weiter.

    Betroffen sind drei Tabellen (FIRMA, FIRMA_PROJEKT, PROJEKT)

    Die Tabelle FIRMA enthält die Firmenstammdaten, die Tabelle PROJEKT die Projektstammdaten, die Tabelle FIRMA_PROJEKT stellt die Verbindung her,
    d.h. in der Tabelle FIRMA_PROJEKT gibt es zwei Spalten, wobei die erste die FirmenID und die zweite die Projektnummer beinhaltet. Die Spalte Projektstatus ist in diesem Zusammenhang nicht relevant.

    Durch dieses Konstrukt ist es möglich, beliebig vielen Firmen beliebig viele Projekte zuzuordnen.

    Ich möchte nun gezielt nach Firmen suchen, welche mehrere Projekte
    zugeordnet haben, was ich mit untenstehendem Statement erfolglos versucht habe zu realisieren.
    Die Suche nach einem Projekt funktioniert einwandfrei, bei der Kombination zweier oder mehrerer erhält man immer eine leere Menge als Ergebnis.

    Vielen Dank für euere Hilfe !


    PHP-Code:
      $OrderFeld "FIRMA.Firmenname";
     
      if (isSet(
    $kosmetik) && ($kosmetik == "X"))
      
    $SelKosmetik "and FIRMA.FNr = FIRMA_PROJEKT.FNr and FIRMA_PROJEKT.ProjektNr = 7 and FIRMA_PROJEKT.ProjektStatus > 3";

      if (isSet(
    $nail) && ($nail == "X"))
      
    $SelNail "and FIRMA.FNr = FIRMA_PROJEKT.FNr and FIRMA_PROJEKT.ProjektNr = 29 and FIRMA_PROJEKT.ProjektStatus > 3";

      if (isSet(
    $feet) && ($feet == "X"))
      
    $SelFeet "and FIRMA.FNr = FIRMA_PROJEKT.FNr and FIRMA_PROJEKT.ProjektNr = 90 and FIRMA_PROJEKT.ProjektStatus > 3";

      if (isSet(
    $hair) && ($hair == "X"))
      
    $SelHair "and FIRMA.FNr = FIRMA_PROJEKT.FNr and FIRMA_PROJEKT.ProjektNr = 38 and FIRMA_PROJEKT.ProjektStatus > 3";

      if (isSet(
    $accessoires) && ($accessoires == "X"))
      
    $SelAccessoires "and FIRMA.FNr = FIRMA_PROJEKT.FNr and FIRMA_PROJEKT.ProjektNr = 217 and FIRMA_PROJEKT.ProjektStatus > 3";



      
    $abfrage sprintf ("%s %s %s %s %s %s %s %s %s %s",
                 
    "select FIRMA.FNr, FIRMA.KdNr, FIRMA.Firmenname, FIRMA.Zusatz, FIRMA.Url, ADRESSE.Strasse,",
                 
    "       ADRESSE.PLZ, ADRESSE.Ort"

                 
    "from   FIRMA, ADRESSE, FIRMA_PROJEKT",
                               
                 
    "where ( ADRESSE.Ort LIKE '%$Ort%' OR ADRESSE.Plz LIKE '$Ort%' ) and FIRMA.Adresse = ADRESSE.AdrIndex",
                 
    $SelKosmetik
                 
    $SelNail,
                 
    $SelHair,
                 
    $SelFeet,
                 
    $SelAccessoires,
                 
                 
    "order by $OrderFeld");

      
    $res mysql_query($abfrage);
      
    $num=mysql_num_rows($res); 
    Zuletzt geändert von weko321; 19.01.2007, 20:10.

  • #2
    beschäftige dich mal mit JOIN und event. GROUP BY

    Kommentar


    • #3
      Hallo asp2php,

      ich habe mich bereits - relativ intensiv - mit diesen Themen beschäftigt und bin trotzdem leider nicht in der Lage eine Lösung zu finden.

      Vielleicht ist es möglich, dass mir jemand einen konkreten Lösungsansatz zeigen könnte.

      Vielen Dank schon mal.

      Kommentar


      • #4
        Original geschrieben von weko321
        Hallo asp2php,

        ich habe mich bereits - relativ intensiv - mit diesen Themen beschäftigt und bin trotzdem leider nicht in der Lage eine Lösung zu finden.

        Vielleicht ist es möglich, dass mir jemand einen konkreten Lösungsansatz zeigen könnte.

        Vielen Dank schon mal.
        ohne Kenntnisse über die Struktur deiner Tabellen wird schwer. Du machst ausserdem einen CROSS JOIN, das ist tödlich für jedes System. Verwende möglichst INNER/LEFT/RIGHT JOIN

        Kommentar


        • #5
          Hallo asp2php,

          anbei - wie gewünscht - die Tabellenstrukturen. Selbige sind hier aus Platzgründen auf die nötigen Spalten reduziert.

          Das Konstrukt mit der Zwischentabelle gibt mir - wie bereits erwähnt die Möglichkeit n:m Beziehungen abzubilden.

          Möchte ich nun wissen, welche Firmen ein Kosmetikstudio ( ProjektNr 7 ) betreiben, funktioniert mein Statement ganz gut und ich erhalte - mit unten genannten beispielhaften Tabellen - als Ergebnis die Firmennummern 1001 - 1005 ( also alle ).

          Ein Kosmetik- UND ein Nagelstudio ( ProjektNr 29 ) betreiben die Firmen 1001, 1002,1005.

          Dieses Ergebnis - sowie die Ergebnisse der anderen Kombinationen - erhalte ich mit meinem Statement nicht.

          Meine Frage ist nun, wie könnte in diesem Falle das konkrete Statement aussehen?

          Nochmals vielen Dank im Voraus !






          Tabelle FIRMA

          FNr Firmenname
          ------------------------------------
          1001 Hans Huber
          1002 Martin Müller
          1003 Lisa Zacherl
          1004 Sabrina Feist
          1005 Renate Bimmler




          Tabelle PROJEKT

          ProjektNr ProjektName
          -----------------------------------
          7 Kosmetikstudio
          29 Nagelstudio
          90 Fusspflegestudio
          38 Haarstudio
          217 Accessoires




          Tabelle FIRMA_PROJEKT

          FNr ProjektNr
          -----------------------------------
          1001 7
          1001 29
          1001 38
          1002 7
          1002 29
          1003 7
          1004 7
          1004 90
          1004 38
          1004 217
          1005 7
          1005 29
          1005 217

          Kommentar


          • #6
            öhm wieso hast du eine Tabelle die dir eine Verbindung herstellt?

            So wie ich das sehe ist doch Tabelle FIRMA_PROJEKT für den Mülleimer oder nicht?

            Relevant für den Inhalt sind welche Spalten deiner Tabelle?


            FNr, Firmenname, ProjektName oder?

            ProjektNr ist das wieder so ein Verbindungsding ??? ;-)

            vlt hilft dir das ja ein wenig weiter... schau dir den query mal in phpmyadmin an

            Code:
            SELECT p1.FNr, p1.ProjektNr, p3.ProjektName
            FROM FIRMA_PROJEKT p1
            LEFT JOIN firma p2 ON p1.FNr = p2.FNr
            LEFT JOIN projekt p3 ON p1.ProjektNr = p3.ProjektNr
            
            
            SELECT p2.Firmenname, count( p1.ProjektNr ) AS menge
            FROM FIRMA_PROJEKT p1
            LEFT JOIN firma p2 ON p1.FNr = p2.FNr
            LEFT JOIN projekt p3 ON p1.ProjektNr = p3.ProjektNr
            GROUP BY p1.FNr
            Gruss Sebastian
            Zuletzt geändert von Sebastian.J; 20.01.2007, 00:10.

            Kommentar


            • #7
              Hallo Sebastian.J

              die Tabelle FIRMA_PROJEKT stellt die n:m Beziehung ( Verbindung war flsch von mir formuliert ) zwischen den Firmen und den entsprechenden Projekten her.

              Ein durchaus übliches Procedere soweit ich weiß.

              Also wenn ich ganz ehrlich bin, kann ich mit Deinem Abfragestatement überhaupt nichts anfangen, was aber eher an meinen mangelnden Kenntnissen liegen dürfte.

              Nach ein wenig googeln habe ich gesehen, dass Du mit sog. Aliases arbeitest.

              Ich habe die beiden Statements in PHPADMIN laufen lassen, aber sie bringen keine brauchbaren Ergenisse.

              In der Tabelle FIRMA interessiert uns hier nur die FNr, in der Tabelle PROJEKTE nur die ProjektNr und in der Tabelle FIRMA_PROJEKTE beide Spalten, da selbige ja eine Firma mit den entsprechenden Projekten in Beziehung setzt.

              Die Aufgabe lautet nun: Zeige mir alle Firmen, welche z.b. mit dem Projekt 29 und dem Projekt 38 eine Beziehung haben.

              Kannst Du mir da bitte helfen.
              Zuletzt geändert von weko321; 20.01.2007, 09:47.

              Kommentar


              • #8
                Original geschrieben von weko321
                Hallo Sebastian.J

                Die Aufgabe lautet nun: Zeige mir alle Firmen, welche z.b. mit dem Projekt 29 und dem Projekt 38 eine Beziehung haben.

                Kannst Du mir da bitte helfen.
                Code:
                SELECT p1.FNr, p1.ProjektNr, p2.Firmenname
                FROM FIRMA_PROJEKT p1
                LEFT JOIN firma p2 ON p1.FNr = p2.FNr
                LEFT JOIN projekt p3 ON p1.ProjektNr = p3.ProjektNr
                WHERE p1.projektNr = 29 OR p1.projektNr = 38

                Kommentar


                • #9
                  Hallo Sebastian.J,

                  danke für Deine Antwort !

                  Leider zeigt mir Dein Ansatz alle Firmen, welche entweder eine Beziehung zu ProjNr. 29 ODER zu ProjNr. 7 haben.

                  Ich brauche als Ergebnis aber alle Firmen, welche eine Beziehung zu einer oder zu mehreren ProjNr Beziehungen haben ( also zb ProjNr. 29 UND ProjNR 7 UND ProjNr 38 ).

                  Ich habe meine Tabellen sowie die Anforderungen weiterer oben beschrieben.

                  Gibt es dafür eine Lösung ?

                  Vielen Dank schon mal.

                  Kommentar


                  • #10
                    Original geschrieben von weko321
                    Hallo Sebastian.J,

                    Leider zeigt mir Dein Ansatz alle Firmen, welche entweder eine Beziehung zu ProjNr. 29 ODER zu ProjNr. 7 haben.

                    Ja das war ja auch die Aufgabe in deinem letztem Post ;-)


                    Original geschrieben von weko321
                    Hallo Sebastian.J,

                    Ich brauche als Ergebnis aber alle Firmen, welche eine Beziehung zu einer oder zu mehreren ProjNr Beziehungen haben ( also zb ProjNr. 29 UND ProjNR 7 UND ProjNr 38 ).

                    Schreib mal ein Beispeil der gewünschten Ausgabe hin mit ein paar Datensätze....

                    FNr | Firmenname | ProjektNr | ProjektName

                    oder so




                    Kommentar


                    • #11
                      Hallo SebastianJ,

                      ich habe mittlerweile eine Lösung, welche funktioniert,
                      aber untragbar langsam ist.

                      Kann man da was dran schrauben ??


                      SELECT f.Firmenname, f.KdNr, a.Ort
                      FROM FIRMA AS f, ADRESSE AS a
                      INNER JOIN FIRMA_PROJEKT AS fp1 ON f.FNr = fp1.FNr
                      INNER JOIN FIRMA_PROJEKT AS fp2 ON f.FNr = fp2.FNr
                      INNER JOIN FIRMA_PROJEKT AS fp3 ON f.FNr = fp3.FNr
                      INNER JOIN FIRMA_PROJEKT AS fp4 ON f.FNr = fp4.FNr
                      WHERE a.Ort LIKE 'berlin'
                      AND f.Adresse = a.AdrIndex
                      AND fp1.ProjektNr =7
                      AND fp2.ProjektNr =29
                      AND fp3.ProjektNr =90
                      AND fp4.ProjektNr =38

                      Kommentar


                      • #12
                        SELECT f.*, p.ProjektNr, f_p.ProjektName
                        FROM firma AS f, projekt AS p, firma_projekt AS f_p
                        WHERE f.FNr = f_p.FNr AND f_p.ProjektNr = p.ProjektNr
                        AND p.ProjektNr IN (7, 29, 38)

                        f.FNr = f_p.FNr AND f_p.ProjektNr = p.ProjektNr
                        stellt über die Hilfstabelle die Verknüpfung zwischen dem Projekt und der Firma her.
                        Lass alles ab AND mal weg und schau dir das Ergebnis an. Es ist das kartesiche Produkt "Firma x Projekt".
                        Aus diesem muß nun noch das rausgepickt werden, was dich interessiert:
                        p.ProjektNr IN (7, 29, 38)
                        reduziert die Ergebnismenge auf die Zeilen mit den gewünschten Projektnummern. Fertig.

                        Kommentar


                        • #13
                          Hallo onemorenerd,

                          danke für Deine Hilfe !

                          Die Sache mit dem IN habe ich früher schon mal probiert.

                          Normalerweise bekommt man da eine Ergebnismenge, welche einer OR Verknüpfung entspricht. Oder ??

                          Ich will aber alle Studios suchen, welche dem einen UND dem anderen Bereich zugeordnet sind.

                          Geht das mit Deiner Lösung ?

                          Kommentar


                          • #14
                            Hallo onemorenerd,

                            ich habs ausprobiert, es geht nicht.

                            Mann bekommt alle Firmen, welche entweder ODER, ODER, ODER in irgendwelchen Bereichen sind.

                            Ich brauche aber Firma Müller betreibt ein Kosmetik UND Nagel- UND Fusspflegestudio.

                            Gibts da eine Lösung ??

                            Kommentar


                            • #15
                              so wie du den Inhalt der Tabelle Firma_Projekt angegeben hast, muss das Ergebnis 3 Firma sein, und zwar 1001, 1002, 1005

                              mit:

                              select a.id from
                              firma a inner join firma_projekt b on a.id=b.fid
                              inner join projekt c on b.pid=c.id
                              where c.id=7 or c.id=29 group by a.id having count(a.id)>1

                              kommst du ans Ziel. Passe die Abfrage an deine Tabellen an, ich war zu faul sie genau zu schreiben

                              Kommentar

                              Lädt...
                              X