Announcement

Collapse
No announcement yet.

Abfrage über 2 Tabellen und im Ergebnis nur Werte die unterschiedlich sind

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Abfrage über 2 Tabellen und im Ergebnis nur Werte die unterschiedlich sind

    Hallo zusammen,

    ich habe folgende Herausforderung. Zum Anzeigen von Artikelvarianten möchte ich eine Abfrage erstellen.
    Die Werte dazu stehen in 2 Tabellen die ich hier verkürzt darstelle:

    PHP Code:
    Tabelle Artikel

    id     
    Name                              farbe   breite   material     laenge     varid
    ------------------------------------------------------------------------------------------- ------------
    1      Besen Arenga 50 cm                rot     50       Arenga       |            | 882
    2      
    Besen Arenga 60 cm                rot     60       Arenga       |            | 882
    3      
    Besen Arenga 80 cm                rot     80       Arenga       |            | 882
    4      
    Microfasertuch 40 x 40 cm         rot     |          |              |            | 650
    5      
    Microfasertuch 40 x 40 cm         blau    |          |              |            | 650
    6      
    Microfasertuch 40 x 40 cm         grün    |          |              |            | 650
    7      
    Teleskopstange 2 m                |         |          | Alu          2          650
    8      
    Teleskopstange 4 m                |         |          | Alu          4          650
    9      
    Teleskopstange 6 m                |         |          | Alu          6          650


    Tabelle Attribute

    id     
    attribut
    ------------------
    1      farbe
    2      
    breite
    3      
    material
    4      
    laenge 
    Die varid in der ersten Tabelle definiert welche Artikel Varianten untereinander sind. Wenn der User nun die Artikeldetailseite
    aufruft ist die id der ersten Tabelle ja bekannt. Jetzt sollen dazu die Varianten gefunden werden, und zwar nur die, die unterschiedliche Werte
    in den Attributen haben, für die Besen also:

    z.B übergebene id für die Tabelle Artikel ist 1

    Besen Arenga 50 cm
    Besen Arenga 60 cm
    Besen Arenga 80 cm

    Es wäre natürlich optimal wenn der Ursprungsartikel in der Liste der Varianten ausgeschlossen ist, aber das kann
    man auch im Nachgang in PHP machen.

    Kann ich das alles in einer SQL-Abfrage machen?
    Und noch eine grundsätzliche Frage, ist es schnelle so was in MySQL zu machen oder in PHP?


    Gruß Nevada

  • #2
    Ich kann jetzt nicht erkennen, wie die Tabelle Attribute mit der Tabelle Artikel verbunden ist...irgendwie fehlt da in der Tabelle die Verknüpfung. Des Weiteren erscheint es sinnvoll, eine Tabelle Attribute mit diesen als Spalte auszubauen und der ID des Artikels
    Christian

    Comment


    • #3
      Vielleicht brauche ich die Tabelle Attribute garnicht. Dann müsste ich aber in der Abfage genau definieren welche Felder Attributfelder sind die ich berücksichtigen möchte.

      Sinngemäß müsste die Abfrage heißen:

      Suche mir alle Zeilen in den die varid = der varid des gewählen Artikels entspricht und bringe mir nur das Feld in denen sich die Werte in den Attributfeldern unterscheiden.

      In dem Beispiel sind alle Besen rot, was mich aber als Variante nicht interessiert, hier wäre die Breite das Kriterium. Also immer das Attribut
      welches unterschiedliche Werte hat.

      Die Attribut Tabelle wollte ich eigentlich dafür nutzen, um zu definieren welche Attribute relavant sind.

      Comment


      • #4
        Originally posted by Nevada208 View Post
        Die Attribut Tabelle wollte ich eigentlich dafür nutzen, um zu definieren welche Attribute relavant sind.
        Und wie verwertest Du diese "Definition"? Das muss ja wohl in der SQL Formulierung irgendwie berücksichtigt werden..
        Das "ginge" m.E. nur OR Konstrukte und wäre nicht mal dynamisch. Ein neuer Eintrag in der Attributtabelle und Du darfst das (jedes) angelehnte Statement umbauen bzw. erweitern.

        Ich habe Deine Idee wohl noch nicht ganz verstanden, aber eines ist sicher:
        Wenn Du Objekt Attribute dynamisch verwalten willst, dann muss Objekt und Attribut auch relational erfasst sein. Deine Spalten farbe, breite, ... usw. sollten alle in einer N:M Relation in eine separate Tabelle wandern.

        Deine "sinngemäße" Formulierung der Abfrage, habe ich leider nicht verstanden. Zumindest nicht so, dass ich auf gut Glück Zeit dafür vergeuden würde, das vermutlich gewünschte SQL Statement zu formulieren, das am Ende doch nicht gewünscht war.
        Gruß, defo

        Comment


        • #5
          So, ich hab mir das ganze mal als Funktion in PHP gebaut:

          PHP Code:
          public function getVariante()
              {
                  
          $sql "SELECT filter_attribut from dbo_filter";
                  
          $res $this->fetch_all($sql);

                  foreach(
          $res as $value)
                  {
                      
          $attrfield  "artikel_".$value['filter_attribut'];
                      
          $sqlattr    "select count($attrfield) as diffvalue from dbo_artikel where artikel_varkey = $this->varkey group by $attrfield";
                      
          $resattr    $this->fetch_one($sqlattr);

                      if(
          $resattr['diffvalue'] == 1)
                      {
                          
          $sqlvariante "select $attrfield from dbo_artikel where artikel_varkey = $this->varkey";
                          
          $resvariante $this->fetch_all($sqlvariante);
                          return 
          $resvariante;
                      }
                  }
              } 
          Das funktioniert, ich bekomme nur das Attribute in denen die Werte unterschiedlich sind. Aber geht das auch in MySQL?
          Ich habe irgendwo gehört das man besser vieles in MySQL abhandeln soll weil es schneller geht als mit PHP? Ist das richtig?

          Comment


          • #6
            Erstmal die Bergriffe klären:

            Aber geht das auch in MySQL?
            SQL -> Structured Query Language. MYSQL und andere DB implementieren den Standard dazu mehr oder weniger.

            Wenn du noch irgendwie erläuterst, was eigenlich wie verglichen werden soll, geht das bestimmt auch in SQL. Jedoch sicherlich nur, wenn die Daten in entsprechenden strukturierten Tabellen liegen
            Christian

            Comment


            • #7
              Originally posted by Nevada208 View Post
              So, ich hab mir das ganze mal als Funktion in PHP gebaut:

              Das funktioniert, ich bekomme nur das Attribute in denen die Werte unterschiedlich sind. Aber geht das auch in MySQL?
              Ich habe irgendwo gehört das man besser vieles in MySQL abhandeln soll weil es schneller geht als mit PHP? Ist das richtig?
              Also was Du da in PHP machst, finde ich auf den ersten Blick vollkommen ok. Du baust dynamisch ein SQL Statement zusammen. Dagegen ist m.E. nichts einzuwenden, so wie Du es hier machst, sofern bestimmte Dinge wie SQL Injection usw. geprüft werden.

              Ich vermute, es geht Dir um Aussagen wie "direkt in sql ist das schneller" oder ähnlich.
              Soetwas ist dann richtig, wenn Ergebnisdaten auf dem Applicationserver weiterverarbeitet werden im Sinne von Filterung usw. also z.B. 1000 Zeilen laden, 900 aussortieren, 100 umbauen und nutzen.

              Auf den 2. Blick sehe, dass es in einer Schleife abläuft und Du u.U. auf dem Weg eine Menge Serveranfragen produzierst.

              Da Deine Attribute Spalten einer Tabelle sind, wirst Du nicht drumrumkommen, sie mit einzelnen Statements zu zählen.
              Man kann das sicher zu einem SQL zusammenfassen, so dass nur eine Anfrage an den Server rausgeht. Das würde aber bedeuten, dass immer alles in dieser Anfrage gezählt wird und dann gegen das Parameterattribut gefiltert wird. Damit hast Du dann wahrscheinlich die Schleife in php gespart.
              Gruß, defo

              Comment


              • #8
                Neues Problem, neuer Thread
                http://entwickler-forum.de/showthrea...eisen-ausgeben
                Christian

                Comment

                Working...
                X