Ankündigung

Einklappen
Keine Ankündigung bisher.

SQL Struktur

Einklappen

Neue Werbung 2019

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

  • SQL Struktur

    Hallo,

    ich habe folgende Tabellen:
    marken, artikel, kategory und artikel2kategorie
    ich versuch das mal darzustellen:
    marke -> marken_id
    artikel -> artikel_id, marken_id
    kategory -> kategory_id
    artikel2kategorie -> id, kategory_id, artikel_id

    In der artikel2kategorie stehen nur die direkten Kategoriezuweisungen zu einem Artikel drin, also:

    Hauptkategorie
    Unterkat 1
    Unterkat 2

    Wenn ein Artikel in Unterkat 2 sein soll, dann wird er nur dort zugewiesen.

    Ich möchte nun folgendes Wissen:
    :: Alle Unterkategorien der Hauptkategorie x, welche Artikel mit der Marke Y enthalten
    :: Alle Hauptkategorien die Unterkategorien enthalten, in denen Artikel mit der Marke Y vorkommen
    :: Alle Marken, die innerhalb einer Unterkategorie der Hauptkategorie X vorkommen.

    Hat jemand eine Ahnung wie ich das machen kann, rein über SQL?

    lgralf

  • #2
    Hallo kerstel,

    wir freuen uns, dass du an der öffentlichen Diskussion hier auf PHP.de teilnimmst. Als Community stehen wir dir gerne helfend zur Seite.
    Jedoch versteht sich PHP.de als Forum für Hilfe zur Selbsthilfe, weshalb wir gewisse Mindestansprüche an die Qualität von Benutzerbeiträgen stellen.
    Diese schließen ein:
    • eine verständliche Fragestellung
    • das Bemühen um eine korrekte Rechtschreibung und Grammatik
    • eine sinnvolle Beitragsformatierung (z.B. Code-Schnipsel in [PHP]-, [HTML]- oder [CODE]-Tags)
    • halbwegs solides Grundlagenwissen in den entsprechenden Bereichen
    • ausführliche, aber nicht ausschweifende Problembeschreibungen
    • relevante Code-Auszüge wo notwendig
    • und ganz wichtig: Eigeninitiative und Aufgeschlossenheit seitens das Fragestellers (das bist du)
    Leider entspricht dein Beitrag nicht ganz diesen Kriterien, weshalb er auf die Grüne Wiese verschoben wurde.

    Dies ist keine Beitragsschließung!

    Du kannst deinen Thread auf der Grünen Wiese gerne weiterführen. Wenn dein Beitrag hier gelandet ist, so ist dies auch kein Beinbruch. Du darfst nur nicht allzu große Hilfe von den erfahrenen Benutzern dieses Forums erwarten und solltest dir einmal Zeit nehmen, unsere Forenrichtlinien genau zu lesen. Auch unsere mühsam erstellte Sammlung von Einsteiger-Ressourcen ist einen gründlichen Blick wert. In aller Regel lässt sich dein Problem nämlich bereits mit dem dort vermittelten Wissen lösen. Eine ausführliche Google-Suche nach deinem Problem schadet selbstverständlich auch nie.

    Und schlussendlich: wenn du dir all dies zu Herzen genommen und verstanden hast, warum dein Beitrag auf der Wiese gelandet ist, klappt es vielleicht beim nächsten Mal.

    Mit besten Grüßen
    Manko10, Forenmoderation

    Kommentar


    • #3
      Zitat von kerstel Beitrag anzeigen
      Hallo,

      ich habe folgende Tabellen:
      marken, artikel, kategory und artikel2kategorie
      ich versuch das mal darzustellen:
      Es wäre vielleicht hilfreich, wenn Du mal ganz einfach Beispieltabellen- und daten lieferst, dazu was rauskommen soll, und was Du bereits versucht hast.

      Andreas

      Kommentar


      • #4
        Hallo Andreas,

        gerne. Versucht habe ich das über PHP, in dem ich mir einfach die Daten aus der DB hole und das ergebnis dann mit foreach durchlaufe um auf die nächsten Werte zu kommen, das ist aber sehr unperformant, deshalb suche ich eine Lösung rein in SQL. Hier habe ich es mit JOINS versucht, bin aber zu keinem Ergebnis gekommen.

        z.B. habe ich für den ersten Fall (Alle Unterkategorien der Hauptkategorie x, welche Artikel mit der Marke Y enthalten) versucht:
        SELECT *
        FROM kategory AS c
        JOIN artikel AS a
        LEFT JOIN artikel2kategorie AS a2c ON a2c. kategory_id = c.kategory_id
        WHERE c.parent_id = '943a9ba3050e78b443c16e043ae60ef3'
        AND a.marken_id = 'tg3e7db7c3d2ca69ff3074cfe3e7dfd0'

        Ich bekomme hier, die gleichen Kategorien mehrmals ausgegeben.

        Das mit den Tabellen habe ich versucht einfach darzustellen, ich versuche es nochmal anders (nur mit den benötigten Feldern):
        Tabelle marke:
        marken_id (ID der Marke), name

        Tabelle artikel
        artikel_id (ID des Artikels), marken_id (ID der Marke), name

        Tabelle kategory
        kategory_id (ID der Kategorie), parent_id (ID der übergeordneten Kategorie)

        Tabelle artikel2kategorie (für n:m Beziehungen zwischen Artikel und Kategorie weil ein Artikel mehreren Kategorien zugeordnet sein kann und eine Kategorie mehrere Artikel enthalten kann)
        id, kategory_id (ID der Kategorie), artikel_id (ID des zugewiesenen Artikels)

        Ist das klarer?

        lgralf

        Kommentar


        • #5
          Zitat von kerstel Beitrag anzeigen
          Hallo Andreas,

          Ist das klarer?

          lgralf
          Nicht wirklich, aber egal. Wie man (mit PostgreSQL) rekursive Abfragen macht, habe ich hier im Forum erst vor wenigen Tagen gezeigt. Ich weiß nicht, ob Du überhaupt PostgreSQL nutzt.

          http://www.php.de/datenbanken/87699-...-struktur.html

          Andreas

          Kommentar


          • #6
            hm, was kann ich tun damit es klarer wird? Welche Info fehlt Dir?

            Nutze mysql5

            Kommentar


            • #7
              Hi,

              Punkt 3 habe ich inzwischen selber hinbekommen:
              Code:
              SELECT DISTINCT man.*
              FROM marke AS man
              JOIN artikel AS art ON art.marken_id = man.marken_id AND art.active =  '1'
              JOIN kategory AS cat ON cat.parentid =  '".$sCategoryID."' AND cat.active =  '1'
              JOIN artikel2kategorie AS a2c ON a2c.kategory_id = cat.kategory_id AND a2c.artikel_id = art.artikel_id
              WHERE man.active =  '1'
              Bei Punkt 1 happert es noch, ich habe folgenden Ansatz:
              Code:
              SELECT DISTINCT cat.* FROM kategory AS cat
              JOIN artikel AS art ON art.active =  '1' AND art.marken_id =  '".$sBrandID."'
              JOIN artikel2kategorie AS a2c ON a2c.kategory_id = cat.kategory_id AND a2c.artikel_id = art.artikel_id
              WHERE cat.active =  '1'
              ORDER BY oxparentid, oxsort, oxtitle
              Allerdings bekomme ich dann nur die Unterkategorien, da diese ja auch die Artikel zugewiesen bekommen haben. Nicht aber die Hauptkategorien, denen ja keine Artikel zugewiesen wurden. Ich möchte hier aber den kompletten Baum haben.

              Die Kategorie Tabelle baut sich so auf:

              kategory_id, parent_id, title, ....
              1, rootid, Hauptkategorie
              2, 1, Unterkategorie 1
              3, 1, Unterkategorie 2
              4, rootid, Hauptkategoire 2

              lgralf

              Kommentar


              • #8
                Da wir gerade von Bäumen sprechen:
                Zitat von kerstel Beitrag anzeigen
                Ich möchte hier aber den kompletten Baum haben.
                Schon mal über nested sets nachgedacht?

                http://de.wikipedia.org/wiki/Nested_Sets
                http://www.klempert.de/nested_sets/
                http://phpperformance.de/nested-sets...eume-in-mysql/
                http://reeg.junetz.de/DSP/node11.htm...00000000000000
                http://www.traum-projekt.com/forum/7...tml#post440236

                Kommentar


                • #9
                  Zitat von meikel Beitrag anzeigen
                  Da wir gerade von Bäumen sprechen:
                  Schon mal über nested sets nachgedacht?
                  Ja, bringt mit aber nichts wenn die DB nicht von mir kommt

                  Kommentar


                  • #10
                    Zitat von kerstel Beitrag anzeigen
                    Ja, bringt mit aber nichts wenn die DB nicht von mir kommt
                    Dann hast Du ein Design Problem, weil die gewünschte Funktionalität vorher (von wem auch immer) nicht berücksichtigt wurde. Was Du versuchst, bezeichne ich gern als "aufbohren".

                    Für nested sets benötigst Du neben id zusätzlich nur noch lft und rgt, welche korrekt gesetzt sein müssen.

                    Kommentar


                    • #11
                      wichtig wäre dass ich erstmal die richtigen ergebnisse bekomme, den baum baut das system nachher von alleine

                      Kommentar


                      • #12
                        Zitat von kerstel Beitrag anzeigen
                        wichtig wäre dass ich erstmal die richtigen ergebnisse bekomme, den baum baut das system nachher von alleine
                        Egal, was das System treibt: Du zäumst das Pferd vom Schwanz auf.

                        Kommentar


                        • #13
                          @kerstel

                          Zu nächst solltes du mal erwähnen nach welchen System dein Baum arbeitet.
                          Nested Sets oder Nachbarschaft Matrix auch genannt (Adjazenzmatrix)

                          http://de.wikipedia.org/wiki/Repr%C3...en_im_Computer

                          Beim der Nachbarschaft Matrix wirst du eine Rekusive Funktion benötigen die alle Teile auslesen kann. Um eben auf deine gewünschten Ergbnisse zu kommen.

                          Mfg Splasch

                          Kommentar


                          • #14
                            Es ist ja schön, dass Du Dich beteiligst, Splasch, aber immer öfter fällt mir auf, dass Du wohl die Beiträge nicht liest oder Aussagen wiederholst. Wozu?

                            Kommentar

                            Lädt...
                            X