Ankündigung

Einklappen
Keine Ankündigung bisher.

Abfrage - left join - wie differenziere ich die Daten

Einklappen

Neue Werbung 2019

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

  • Abfrage - left join - wie differenziere ich die Daten

    Hallo,
    ich komme leider hier gar nicht weiter. Vielleicht kann mir jdm einen Tipp geben.
    In meiner DB gibt es eine Tabelle "Artikel" eine Tabelle "Attribute" wie zB Farbe und eine weitere Tabelle mit den "Attributausprägungen" wie zB "rot".

    Als Beispiel habe ich einen Artikel XYZ mit den Attributen "Farbe", "Größe" und "Geschlecht". Und in der Tabelle Attributausprägungen dann über eine ID zugeordnet die Ausprägungen "Rot", "XL" und "Frau".

    Mein Select (stark vereinfacht):
    SELECT
    art.id AS art_id,
    objat.value,
    objat.attrid,
    FROM
    artikel as art
    LEFT JOIN objectattribute as objat
    ON (artikel.id = objat.artikelid)
    WHERE
    art.active = 1
    GROUP BY
    art.id

    Danach kommt das ganze in ein Array:
    $sqlrow = mysql_fetch_array($sql_query)

    $Liste[] = array(
    'ArtikelID' => $sqlrow['art_id'],
    ...
    ...
    ...
    );

    Das ganze klappt auch soweit. ABER: Werte wie zb die ID sind ja einmalig. Diese kann ich in der Liste später eindeutig zuordnen. Was ich nicht kann: die Attribut-Ausprägungen einem Artikel eindeutig zuweisen/auswerten.
    Wenn ich zB bei SELECT WHERE objat.attrid = 'Farbe' einfüge, kann ich später in der Liste über abjat.value auf diese Attributausprägungen zugreifen. Aber wie komme ich an alle Attribute und kann diese in der Liste später trennen?
    Ich würde also so etwas benötigen (was nicht geht):

    $Liste[] = array(
    'Farbe' => $sql_row['value'] WHERE objat.attrid = 'Farbe',
    'Größe' => $sqlrow['value'] WHERE objat.attrid = 'Größe',
    'Geschlecht' => $sqlrow['value'] WHERE objat.attrid = 'Geschlecht',
    );

    Für Tipps bin ich dankbar
    Danke und Gruß


  • #2
    Hallo, willkommen im Forum.

    Kannst du dein Szenario bitte nachstellen? Tabellenstruktur und ein paar Beispielwerte würden helfen: http://sqlfiddle.com

    Codebeispiele bitte in den entsprechenden Tags posten, das verbessert die Lesbarkeit.
    Mein Select (stark vereinfacht):
    Bitte IMMER den tatsächlichen Code posten. Mit einer stark vereinfachten Version kann hier niemand etwas anfangen und es verschleiert die Situation.


    Ich rate jetzt einfach mal:
    Aus dem Select bringt dir die Attribut-ID nicht viel, hol dir auch noch das Attribut. Dann sieht dein Ergebnis etwa so aus:
    Code:
    Artikel | Attribut       | Wert
    Hose   | Farbe          | rot
    Hose   | Geschlecht  | Frau
    Überspringen wir den eventuellen Gruppenbruch, http://php-de.github.io/jumpto/gruppenbruch/, und kommen gleich zu den Attributen.
    PHP-Code:
    $list[$sqlrow['Artikel']][$sqlrow['Attribut']] = $sqlrow['Wert']; 
    Etwa so sollte es funktionieren.
    Relax, you're doing fine.
    RTFM | php.de Wissenssammlung | Datenbankindizes | Dateien in der DB?

    Kommentar


    • #3
      Was ich nicht kann: die Attribut-Ausprägungen einem Artikel eindeutig zuweisen/auswerten.
      Warum nicht?

      Oder anders gefragt: Was willst du genau erreichen?
      Jeden Artikel einmal mit einer Liste aller Attribute, oder alle Artikel die einem oder mehr Attributen entsprechen?
      Über 90% aller Gewaltverbrechen passieren innerhalb von 24 Stunden nach dem Konsum von Brot.

      Kommentar


      • #4
        Hallo,

        danke für das erste Feedback!

        @VPh: ich poste später das alles mal so. Wollte es "bereinigen" um auf mein Kernproblem zu kommen. Es gibt noch mehr Joins und Where Bedingungen die mit diesem Problem nichts zu tun haben. Aber stimmt schon.

        @Istegelitz: ich habe eine Tabelle mit Artikel, eine weitere Tabelle mit Attributen (Farbe, Größe, Geschlecht, etc) und die Tabelle objectattribute und denen die Ausprägungen stehen. Dort gibt es zB für den Artikel xyz drei Einträge. Rot, XL und Frau. Ich habe noch weitere Artikelwerte die ich hiermit
        PHP-Code:
        $sqlrow mysql_fetch_array($sql_query)

        $Liste[] = array(
        'ArtikelID' => $sqlrow['art_id'],
        ...
        ...
        ...
        ); 
        in eine Liste schreibe und später weiter verarbeite. Jetzt habe ich das Problem dass ich die verschiedenen Attribute nicht unterscheiden kann. In der Tabelle objectattribute steht bei jedem Attribut eine ID welche den Typ bestimmt. Also zb 123 besagt dass das Attribut vom Typ Farbe ist. ID 456 besagt es ist Größe etc.

        Wenn ich jetzt in $Liste[] die Werte zuordne kann ich dies nicht in Abhängigkeit der ID machen. Ich möchte also sagen dass 'Farbe' => $sqlrow['objectattribute.value'] gesetzt wird WENN die ID in dieser Tabelle 123 ist.
        Vielleicht ist dies aber so gar nicht möglich. Ich kann mein komplettes Select mit einer Where Bedingung auch filtern. Dann bekomme ich trotzdem alle meine Artikel aber eben zB nur Attributausprägungen mit Farbe. Aber ich brauch alle Attributausprägungen. Später soll jeder Artikel in einer Zeile stehen und die Werte hintereinander.

        Vielen Dank!
        Gruß

        Kommentar


        • #5
          Zitat von anhocy Beitrag anzeigen
          Vielleicht ist dies aber so gar nicht möglich. Ich kann mein komplettes Select mit einer Where Bedingung auch filtern. Dann bekomme ich trotzdem alle meine Artikel aber eben zB nur Attributausprägungen mit Farbe. Aber ich brauch alle Attributausprägungen. Später soll jeder Artikel in einer Zeile stehen und die Werte hintereinander.
          Ich denke, Du suchst eine Key-Value-Store wie HSTORE in PostgreSQL, oder JSONB, auch PostgreSQL.
          PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services

          Kommentar


          • #6
            Zitat von anhocy Beitrag anzeigen
            Wenn ich jetzt in $Liste[] die Werte zuordne kann ich dies nicht in Abhängigkeit der ID machen.
            Warum kannst du das nicht? Das läuft doch genau auf das von VPh gepostet http://php-de.github.io/jumpto/gruppenbruch/ hinaus.

            PHP-Code:
            $products = array();

            foreach(
            $result AS $daten) {
                if(!isset(
            $products[$daten['art_id']])) {
                    
            $products[$daten['art_id']] = array('art_id' => $daten['art_id']); //oder gleich $daten wenn da noch mehr allgemeine daten drin stehen
                
            }
                
                
            $products[$daten['art_id']][$daten['attribute_name']] = $daten['value'];

            PS:
            -die Mysql Erweiterung ist depracated, alternativen sind PDO oder Mysqli
            -Aus art.id wird art_id und daraus ArtikelID. Bei größeren Projekt kommt da schnell einige Variationen zusammen. Gewöhn dir sowas besser ab...

            Kommentar


            • #7
              Also dass mit dem Gruppenbruch hab ich glaube soweit verstanden. Bin von meinem Verständnis weiter gekommen (bin wirklich Anfänger).
              Aber mein Problem ist leider weiterhin ungelöst.

              Per http://sqlfiddle.com bin ich jetzt aber auf etwas anderes gekommen. Sobald in meinem Select das "GROUP BY art.id" steht werden die Zeilen anhand der Artikel-ID ja zusammengefasst. Damit aber auch verschiedenen Attribute. Heißt ich habe nicht den Artikel in 3 Zeilen und mit allen 3 verschiedenen Attributausprägungen. Sondern es gibt 1 Zeile mit einer Ausprägung.

              Also nicht:
              PHP-Code:
              Artikel Attribut       Wert
              Hose   
              Farbe          rot
              Hose   
              Geschlecht  Frau 
              sondern:
              PHP-Code:
              Artikel Attribut       Wert
              Hose   
              Farbe          rot 

              Kommentar


              • #8
                Weil Group By verkehrt ist. Mit dem Gruppenbruch gruppierst du in PHP.
                Per sql-fiddle kannst du dein Schema und Query auch mit uns teilen.
                Relax, you're doing fine.
                RTFM | php.de Wissenssammlung | Datenbankindizes | Dateien in der DB?

                Kommentar

                Lädt...
                X