Ankündigung

Einklappen
Keine Ankündigung bisher.

verschachtelung über 4 Tabellen - HILFE

Einklappen

Neue Werbung 2019

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

  • verschachtelung über 4 Tabellen - HILFE

    Moin!

    Ich habe 4 Tabellen:

    1. Adressen (Felder: ID, Sperrvermerk)
    2. el_Product (Felder: ID, msnID)
    3. el_MSN (Felder: ID, ProductID)
    4. CSTM_Telefonbuch (ID, msnID)

    Ich möchte Daten in CSTM_Telefonbuch selektieren, muss aber das Feld 'Sperrvermerk' der Tabelle 'Adressen' berücksichtigen (es muss leer sein). Die Tabellen sind alle miteinander über eine ID verknüpft, ich versuche das mal zu verdeutlichen:

    CSTM_Telefonbuch.msnID -> wird gespeichert mit el_MSN.ID
    el_MSN.ProductID -> wird gespeichert mit el_Product.ID
    el_Product.AdressID -> wird gespeichert mit Adressen.ID

    Jetzt möchte ich mir die ID von CSTM_Telefonbuch ausspucken lassen, wo der das Feld Sperrvermerk von der Tabelle Adressen leer ist - ich hoffe, das ist anschaulich...

    Kann mir jemand konkret helfen?

    Viele Grüße

    CSTM_Telefonbuch
    Brontalos Multigaming


  • #2
    Hi,

    Ja, du brauchst JOIN (http://de.wikibooks.org/wiki/Einf%C3...eiten_mit_JOIN) um die Abfrage zu machen, die wirklich nicht so schwer ist.

    mfg wolf29
    while (!asleep()) sheep++;

    Unterschätze nie jemanden der einen Schritt zurück geht! Er könnte Anlauf nehmen.

    Kommentar


    • #3
      Hallo wolf29,

      danke für den Hinweis, es hat aber auch ohne JOIN funktioniert:

      Code:
      SELECT 
        CSTM_Telefonbuch.ID, 
        CSTM_Telefonbuch.msnID, 
        CSTM_Telefonbuch.DatensatzID, 
        CSTM_Telefonbuch.validFrom, 
        CSTM_Telefonbuch.validto, 
        CSTM_Telefonbuch.A06_Auftragsart, 
        CSTM_Telefonbuch.R_Länderkennzahl, 
        CSTM_Telefonbuch.R_KennZahl, 
        CSTM_Telefonbuch.R_MSN, 
        CSTM_Telefonbuch.R_Zentrale, 
        CSTM_Telefonbuch.R_Nebenstelle, 
        CSTM_Telefonbuch.E_Beruf_Geschäft, 
        CSTM_Telefonbuch.E_Nutzung, 
        CSTM_Telefonbuch.E_Nutzung_Print, 
        CSTM_Telefonbuch.E_Nutzung_Elektronik, 
        CSTM_Telefonbuch.E_Nutzung_Auskunft, 
        CSTM_Telefonbuch.E_Name, 
        CSTM_Telefonbuch.E_Vorname, 
        CSTM_Telefonbuch.E_Vorsatzwort, 
        CSTM_Telefonbuch.E_Titel, 
        CSTM_Telefonbuch.E_Strasse, 
        CSTM_Telefonbuch.E_Hausnummer,
        CSTM_Telefonbuch.E_Hausnummerzusatz, 
        CSTM_Telefonbuch.E_Postleitzahl, 
        CSTM_Telefonbuch.E_Ortsname, 
        CSTM_Telefonbuch.E_Ortszusatz, 
        CSTM_Telefonbuch.E19_Suchverzeichniss, 
        CSTM_Telefonbuch.E20_InverseSuche, 
        CSTM_Telefonbuch.E22_KzAdresse, 
        CSTM_Telefonbuch.E27_KomplexKz, 
        Adressen.Sperrvermerk 
      FROM 
        organice.dbo.CSTM_Telefonbuch CSTM_Telefonbuch, 
        organice.dbo.el_MSN el_MSN, 
        organice.dbo.el_Product el_Product, 
        organice.dbo.Adressen Adressen 
      WHERE 
      	CSTM_Telefonbuch.msnID = el_MSN.ID 
      AND 
      	el_MSN.ProductID = el_Product.ID 
      AND 
      	el_Product.AdressID = Adressen.ID 
      AND 
      	CSTM_Telefonbuch.DatensatzID LIKE '' 
      AND 
      	CSTM_Telefonbuch.validFrom <= '25-06-2014' 
      AND 
      	CSTM_Telefonbuch.A06_Auftragsart LIKE 'a' 
      AND 
      	Adressen.Sperrvermerk LIKE '' 
      ORDER BY 
      	CSTM_Telefonbuch.E_Name 
      ASC
      Wenn ich dieses Statement mit dem SQL Manager Lite ausführe, bekomme ich ganz wunderbar meine Ergebnisse geliefert. Sobald ich aber den Query über sqlsrv starte (PHP), bekomme ich folgende Fehlermeldung:

      PHP-Code:
      Array ( [0] => Array ( [0] => 42000 [SQLSTATE] => 42000 [1] => 102 [code] => 102 [2] => [Microsoft][SQL Server Native Client 11.0][SQL Server]Falsche Syntax in der Nähe von '�'. [message] => [Microsoft][SQL Server Native Client 11.0][SQL Server]Falsche Syntax in der Nähe von '�'. ) ) 
      Die Verbindung zur Datenbank ist soweit Okay, die funktioniert.
      Brontalos Multigaming

      Kommentar


      • #4
        Ich würde erst mal auf "falscher Zeichensatz" tippen. Entweder beim Client, oder in der Sourcedatei. Umlaute in Spaltennamen ist/sind aber schlechter Stil!
        Standards - Best Practices - AwesomePHP - Guideline für WebApps

        Kommentar


        • #5
          Hi,

          danke für den Hinweis, es hat aber auch ohne JOIN funktioniert:
          ...ist ja wie JOIN, so wie du es umgesetzt hast. M.E. ist es mit Join "sauberer".

          CSTM_Telefonbuch.DatensatzID LIKE ''
          wofür machst du das? ich glaub ich weiß was du damit willst, aber ist nicht optimal.

          Sobald ich aber den Query über sqlsrv starte (PHP), bekomme ich folgende Fehlermeldung:
          prüf mal deine Zeichencodierung

          mfg wolf29
          while (!asleep()) sheep++;

          Unterschätze nie jemanden der einen Schritt zurück geht! Er könnte Anlauf nehmen.

          Kommentar


          • #6
            Zitat von rkr Beitrag anzeigen
            Ich würde erst mal auf "falscher Zeichensatz" tippen. Entweder beim Client, oder in der Sourcedatei. Umlaute in Spaltennamen ist/sind aber schlechter Stil!
            Dein Tip war goldrichtig

            Ja ich weiss, das Datenbankdesign stammt nicht von mir, ich darf mich jetzt aber damit ärgern -.-

            es hat funktioniert, indem ich den Query encoded hab:

            PHP-Code:
            $sql utf8_decode("[QUERY]"); 
            Um die Ergebnisse in PHP vernünftig anzeigen zu lassen, muss man die abgeholten Zeilen wieder encodieren:

            PHP-Code:
            while( $obj sqlsrv_fetch_object$tb_erg)) {
              echo 
            $obj->E_Name;

            Brontalos Multigaming

            Kommentar


            • #7
              Einfacher:
              PHP-Code:
              $connectionInfo = array(... , "CharacterSet" => "UTF-8");
              $conn sqlsrv_connect($serverName$connectionInfo); 
              Standards - Best Practices - AwesomePHP - Guideline für WebApps

              Kommentar


              • #8
                Zitat von wolf29 Beitrag anzeigen
                Hi,

                wofür machst du das? ich glaub ich weiß was du damit willst, aber ist nicht optimal.
                Ich möchte alle Datensätze abgreifen, die LEER sind (oder nicht gesetzt wurden resp. NULL-Felder)



                Ich bin für jeden Vorschlag offen
                Brontalos Multigaming

                Kommentar


                • #9
                  Hi,

                  Wenn die Spalte den Default-Wert NULL hat einfach über

                  PHP-Code:
                  WHERE feldname IS NULL 
                  mfg wolf29
                  while (!asleep()) sheep++;

                  Unterschätze nie jemanden der einen Schritt zurück geht! Er könnte Anlauf nehmen.

                  Kommentar


                  • #10
                    Zitat von wolf29 Beitrag anzeigen
                    Hi,

                    Wenn die Spalte den Default-Wert NULL hat einfach über

                    PHP-Code:
                    WHERE feldname IS NULL 
                    mfg wolf29
                    Hmm...

                    Dieses Feld wird automatisch mit einem leeren String, aber nicht mit NULL abgespeichert, wenn keine Eingabe erfolgt. IS NULL funktioniert also nicht.
                    Brontalos Multigaming

                    Kommentar


                    • #11
                      Dann prüf halt auf einen Leerstring, nicht auf IS NULL...
                      Zitat von nikosch
                      Macht doch alle was Ihr wollt mit Eurem Billigscheiß. Von mir aus sollen alle Eure Server abrauchen.

                      Kommentar


                      • #12
                        Statement steht, Zählerei = Quälerei...

                        Danke nochmal für die hilfreichen Antworten bisher!

                        Nun stehe ich vor dem Problem, das ich die Anzahl der Ergebniszeilen zählen möchte, hierzu habe ich natürlich erstmal die Funktion
                        Code:
                        sqlsrv_num_rows($conn, $query)
                        gefunden.

                        Führe ich die Funktion jedoch so aus, bekomme ich folgende Fehlermeldung:

                        PHP-Code:
                        Fatal errorParam count and argument count don't match. in ... 
                        so, jetzt hab ich mir die Doku wieder angeschaut und folgendes entdeckt:

                        Code:
                        Return Values ¶
                        
                        Returns the number of rows retrieved on success and FALSE if an error occurred. If a forward cursor (the default) or dynamic cursor is used, FALSE is returned.
                        Verstehe ich das jetzt richtig, das ich den CURSOR-Typ auf Statisch umstellen müsste, damit die Zeilen gezählt werden? Wenn ja, wie stelle ich auf static um?

                        Ich meine, hier schon die Antwort gefunden zu haben, jedoch tu ich mich etwas schwer beim Umsetzen für mein Statement
                        Code:
                        $stmt = sqlsrv_query( $conn, "SELECT * FROM ScrollTest", array(), array( "Scrollable" => 'keyset' ));
                        // $stmt = sqlsrv_query( $conn, "SELECT * FROM ScrollTest", array(), array( "Scrollable" => 'dynamic' ));
                        // $stmt = sqlsrv_query( $conn, "SELECT * FROM ScrollTest", array(), array( "Scrollable" => 'static' ));
                        hier wird erst der sqlsrv_query angestossen, als ersten parameter die Verbindungsvariable, dann das Statement als zweiten Parameter, als dritter Parameter dann der CursorType in einem Array. Sieht bei mir dann wie folgt aus:
                        PHP-Code:
                        $rows sqlsrv_num_rows($pconn$tbquery, array(), array( "Scrollable" => 'static' )); 
                        leider noch die selbe Fehlermeldung...

                        Mach ich das vom Ansatz her schon falsch? Hat jemand eine optimalere Lösung für mich?
                        Brontalos Multigaming

                        Kommentar


                        • #13
                          guck bitte bei Parameter und nicht bei return values
                          mixed sqlsrv_num_rows ( resource $stmt ) <- 1 Parameter

                          am besten du hast immer 1 Browsertab fürs PHP Manual offen (http://php.net/manual/en/function.sqlsrv-num-rows.php)
                          "Irren ist männlich", sprach der Igel und stieg von der Drahtbürste

                          Kommentar


                          • #14
                            Zitat von eagle275 Beitrag anzeigen
                            guck bitte bei Parameter und nicht bei return values
                            mixed sqlsrv_num_rows ( resource $stmt ) <- 1 Parameter

                            am besten du hast immer 1 Browsertab fürs PHP Manual offen (http://php.net/manual/en/function.sqlsrv-num-rows.php)
                            OK sowohl auf php.net als auch auf der Microsoft Page für den SQLSRV quäle ich mich jetzt durch - kannst du mir nich einen Hinweis geben, wie die Reihenfolge korrekt sein sollte? Ich mein in den Beispielcodes von Microsoft ist es genau so angegeben...
                            Brontalos Multigaming

                            Kommentar


                            • #15
                              Warum nicht SELECT COUNT(*) FROM
                              Standards - Best Practices - AwesomePHP - Guideline für WebApps

                              Kommentar

                              Lädt...
                              X