Ankündigung

Einklappen
Keine Ankündigung bisher.

SQL Struktur

Einklappen

Neue Werbung 2019

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

  • kerstel
    hat ein Thema erstellt SQL Struktur.

    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

  • nikosch
    antwortet
    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?

    Einen Kommentar schreiben:


  • splasch
    antwortet
    @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

    Einen Kommentar schreiben:


  • Gast-Avatar
    Ein Gast antwortete
    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.

    Einen Kommentar schreiben:


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

    Einen Kommentar schreiben:


  • Gast-Avatar
    Ein Gast antwortete
    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.

    Einen Kommentar schreiben:


  • kerstel
    antwortet
    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

    Einen Kommentar schreiben:


  • Gast-Avatar
    Ein Gast antwortete
    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

    Einen Kommentar schreiben:


  • kerstel
    antwortet
    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

    Einen Kommentar schreiben:


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

    Nutze mysql5

    Einen Kommentar schreiben:


  • akretschmer
    antwortet
    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

    Einen Kommentar schreiben:


  • kerstel
    antwortet
    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

    Einen Kommentar schreiben:


  • akretschmer
    antwortet
    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

    Einen Kommentar schreiben:


  • Manko10
    antwortet
    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

    Einen Kommentar schreiben:

Lädt...
X