Adler87: Hilfe bei mysql-Abfrage

Hallo,

zuerst will ich mich erstmal für den nichtssagenden Betreff entschuldigen. Ich wusste auf Anhieb kein Besseren.

Zum meinem Problem:

Ich ordne Artikel in verschiedene Gruppen ein, diese Gruppen befinden sich wieder in anderen Gruppen usw.
Konkret sieht das so aus:

Maingroup
-Subgroup
--Article_Group
---Article
---Article
--Article_Group
---Article
-Subgroup
--Article_Group
---Article
Maingroup
-Subgroup
--Article_Group
---Article

In der mySQL-DB hab ich dafür 2 Tabellen erstellt

Groups

  • g_id <--Die ID der Gruppe
  • g_val <--Der Name der Gruppe
  • g_type <--Die Art der Gruppe also ob Main-, Sub- oder Article Group
  • g_parent <--Die übergeordnete Gruppe (bei Maingroup = 0)

Articles

  • a_id <--Die ID des Artikels
  • a_val <--Der Name des Artikels
  • a_grp <--Die ID der Artikelgruppe

Jetzt will ich per Abfrage alle Maingroups, die mindestens einmal den kompletten Aufbau (Subgroup->Article_Group->Article) beinhalten, holen.

Ich bin für jede Hilfe dankbar.

Gruß
Adler

  1. zuerst will ich mich erstmal für den nichtssagenden Betreff entschuldigen. Ich wusste auf Anhieb kein Besseren.

    Wenigstens hast du das DBMS genannt :) ich bin so frei und ändere den Betreff damit du ggf. danach auch in einer Suchmaschine suchen kannst.

    Jetzt will ich per Abfrage alle Maingroups, die mindestens einmal den kompletten Aufbau (Subgroup->Article_Group->Article) beinhalten, holen.

    Was du suchst, nennt sich Nested Set - dabei möchtest du ggf. nohcmal dein Datenbankdesign überdenken. So wie ich dich verstehe brauchst du g_type zb garnicht da sich die Einordnung ja aus der Tiefe der Verschachtelung ergibt. Alles was keine Elterngruppe hat ist automatisch eine Hauptgruppe, alles zwischendrin eine Subgruppe und alle Gruppen die einen Artikel als Kind haben sind eine Artikelgruppe.

    MySQL hält hierzu sogar einen Artikel bereit:
    http://dev.mysql.com/tech-resources/articles/hierarchical-data.html

    1. Was du suchst, nennt sich Nested Set - dabei möchtest du ggf. nohcmal dein Datenbankdesign überdenken. So wie ich dich verstehe brauchst du g_type zb garnicht da sich die Einordnung ja aus der Tiefe der Verschachtelung ergibt. Alles was keine Elterngruppe hat ist automatisch eine Hauptgruppe, alles zwischendrin eine Subgruppe und alle Gruppen die einen Artikel als Kind haben sind eine Artikelgruppe.

      MySQL hält hierzu sogar einen Artikel bereit:
      http://dev.mysql.com/tech-resources/articles/hierarchical-data.html

      Deine Nachricht hat bei mir Freude, aber auch ein wenig Magenschmerzen ausgelöst.

      Freude, weil ich dank deiner Hilfe eine passende Lösung für mich gebastelt habe.
      Magenschmerzen, weil du mit deinem Einwand, dass g_type überflüssig ist, natürlich recht hast. Jetzt ringe ich innerlich mit mir das Feld zu löschen und damit aber auch jede SQL-Abfrage (und das sind viele...) in meinen Programmcode zu ändern oder das Feld in der DB zu lassen...

      Danke für deine Hilfe und den Link zu dem Artikel.

  2. moin,

    Jetzt will ich per Abfrage alle Maingroups, die mindestens einmal den kompletten Aufbau (Subgroup->Article_Group->Article) beinhalten, holen.

    viele wege führen nach rom, ein lösungsweg hängt stark davon ab, ob die verschattelung immer so aussieht wie beschriebe, sprich:

    main group -> subgroup -> article group -> artikel

    sollte das zwigend <immer und wirklich immer> so sein, kannst du es mit einfachen joins lösen, musst halt in der WHERE klauel die entsprechenden g_type werte setzen. wenn diese art der rekursion immer so ist, dann stellt sich aber auch die frage, ob man dann nicht eventuell das daten-design überarbeitet, falls das möglich ist oder es gründe gibt, die dagegen sprechen.

    Ilja