Reihenfolge von Datensätzen aus 2 Tabellen festlegen (inkl. Nested Sets)

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

  • Reihenfolge von Datensätzen aus 2 Tabellen festlegen (inkl. Nested Sets)

    Hallo,

    gleich noch ein Problem, bei dem mir der logische Ansatz fehlt.

    Es gibt eine Tabelle mit Warengruppen (mit Nested Sets):

    id (INT, AI)
    links (INT)
    rechts (INT)
    bez (VARCHAR)

    und eine Tabelle mit Artikeln, die einer oder mehreren Warengruppe(n) zugeordnet sind:

    id (INT, AI)
    warengruppen_ids (VARCHAR)
    bez (VARCHAR)

    "warengruppen_ids" dient als dynamisches Set.

    Wenn ein Artikel z. B. den Warengruppen 5, 7 und 9 zugeordnet ist, sieht der DS so aus:

    id: 1
    warengruppen_ids: 5,7,9
    bez: artikel_xyz

    Aber das ist klar.

    Das Problem besteht nun darin, dass ich die Reihenfolge der Artikel bestimmen möchte. Ich könnte natürlich ein Feld "rang" hinzufügen. Das würde funktionieren, wenn ein Artikel in einer Warengruppe ist. Aber wie löse ich das nun, wenn der Artikel mehreren Warengruppen zugeordnet ist und jede Warengruppe natürlich eine unterschiedliche Anzahl von Artikeln mit verschiedenen Reihenfolgen hat?

    Der besagte Artikel "artikel_xyz" soll z. B. in der Warengruppe 5 an 1., in der Warengruppe 7 an 15. und in der Warengruppe 9 an 30. Stelle sein.

    Ich habe mir überlegt, eine neue Tabelle zu erstellen, die nur die Reihenfolge beinhaltet. Also z. B.

    artikel_id
    warengruppen_id
    rang

    Ich glaube nicht, dass das die beste Lösung ist. Würde sich ein Artikel in 12 Warengruppen befinden und würde ich ihn löschen, müsste ich anschließend alle Artikel dieser 12 Warengruppen neu sortieren bzw. die Reihenfolge der nachfolgenden Artikel um eins reduzieren lassen. Und auch hier hätte ich ein Problem, diese Neusortierung in einer Query abzuwickeln. Würde das gehen?

    Fällt jemandem eine schönere Alternative ein?

    Schöne Grüße,

    plastikbaum

  • #2
    Wenn ein Artikel z. B. den Warengruppen 5, 7 und 9 zugeordnet ist, sieht der DS so aus:

    id: 1
    warengruppen_ids: 5,7,9
    bez: artikel_xyz
    das ist recht ungünstig. Du solltest besser eine zusätzliche Tabelle erzeugen mit den Feldern:

    artikel_id
    warengruppen_id

    Hier kannst du dann jedem Artikel zuordnen, zu welcher Warengruppe er gehört. Das macht die Abfragen später deutlich einfacher, vor allem, wenn ein Artikel zu mehr als einer Warengruppe gehören kann.

    Gruß Marian
    Online-Kurse die jeder versteht: HTML, PHP, MySQL, Word, Excel
    http://www.lernpilot.de/wbt/

    Kommentar


    • #3
      Das ist natürlich richtig. Aber hier ergibt sich eben das andere Problem, welches ich ganz unten genannt habe.

      Kommentar


      • #4
        Es besteht eigentlich kein Problem, du hast allerdings das Prinzip der Datenbank nicht richtig verstanden ;-)

        Wenn Datensätze gelöscht werden, brauch man (sofern das Design korrekt ist), keine Datensätze zu ändern oder neu zu sortieren. Ich würde dir eine geeignete Lösung vorschlagen, leider habe ich nicht verstanden, was du eigentlich erreichen willst.

        Wenn für dich einfach eine Warengruppe früher in der Sortierung erscheinen soll, brauchst du natürlich eine Sortier-Reihenfolge innerhalb der Warengruppen-Tabelle.

        Artikel -> Zuordnung Artikel/Warengruppe -> Warengruppen
        artikel_id -> artikel_id, warengruppen_id -> warengruppen_id, sortier-Rang

        Vielleicht wird's jetzt klarer.

        Ich habe dir hier mal einen kleinen Artikel dazu mit Beispieldaten online-gestellt:

        http://www.heddesheimer.de/coaching/warengruppen.html

        Gruß Marian
        Zuletzt geändert von heddesheimer; 05.08.2005, 17:58.
        Online-Kurse die jeder versteht: HTML, PHP, MySQL, Word, Excel
        http://www.lernpilot.de/wbt/

        Kommentar


        • #5
          Danke, dass du dich meiner annimmst Jedoch denke ich, dass wir etwas aneinander vorbeireden.

          Ich möchte nicht die Warengruppen sortieren, bzw. das ist kein Problem - immerhin ein Nested Set.
          Mir geht es um die Sortierung der Artikel innerhalb einer Warengruppe. Um dein Beispiel mit den Kugelschreibern aufzugreifen:

          Der Kugelschreiber A1 soll in der Warengruppe WG1 an Position 7 erscheinen. Derselbe Kugelschreiber A1 soll in der Warengruppe WG2 an Position 29 erscheinen. In der WG3 an Position 13, etc.

          Folglich muss ich die Reihenfolge der Artikel innerhalb ihrer Warengruppen in der Hilfstabelle speichern, in der auch die Zuordnungen abgelegt werden. Nehmen wir also an, die Tabelle bzw. ihr Inhalt sieht so aus:

          Code:
          artikel_id  |  warengruppen_id  | position
          ------------------------------------------
          1           |  1                | 1
          2           |  1                | 2
          3           |  1                | 3
          4           |  1                | 4
          5           |  1                | 5
          6           |  1                | 6
          7           |  1                | 7
          8           |  1                | 8
          9           |  1                | 9
          1           |  2                | 1
          2           |  2                | 2
          3           |  2                | 3
          1           |  3                | 1
          2           |  3                | 2
          3           |  3                | 3
          1           |  4                | 1
          2           |  4                | 2
          Der Artikel mit der ID 1 ist 4 Warengruppen zugeordnet. Nun wird dieser Artikel gelöscht. Folglich wird in jeder der 4 betroffenen Warengruppen eine Position frei und die nachfolgenden Artikel dieser Gruppen müssen "nachrücken".

          Nun könnte man sagen, dass sie nicht narücken müssen, da sich durch das "Ausscheiden" eines Datensatzes nichts an der Reihenfolge ändert. Das ist korrekt. Aber hier entsteht ein anderes Problem (das ich noch nich erwähnt habe Die Reihenfolge der Artikel wird innerhalb des WWS mit Positionstasten geändert. Also praktisch um eins nach oben oder um eins nach unten. Es werden also immer die Positionen zweier DS getauscht.

          Soll z. B. Artikel 1 um eine Position nach unten geschoben werden, also mit Artikel 2 tauschen, innerhalb der Warengruppe 1, so läuft das so ab:

          raufoderrunter=1

          SELECT position AS ALTposition FROM wws_zuordnungen WHERE artikel_id=1;

          UPDATE wws_zuordnungen SET position=position+raufoderrunter*-1 WHERE position=ALTposition+raufoderrunter AND warengruppen_id=2;

          UPDATE wws_zuordnungen SET positoin=position-raufoderrunter*-1 WHERE id=1 AND warengruppen_id=2;

          Und in die andere Richtung wäre raufoderurnter=-1

          Eigentlich ein einfaches und sehr zuverlässiges System. Aber auch hier lasse ich mich gerne belehren, wenn es eine bessere Möglichkeit gibt, die Reihenfolge von Artikeln, die mehreren Gruppen zugeordnet sein können, innerhalb dieser Gruppen zu ändern. Wobei das "Tauschen" mit den nach-oben und nach-unten Pfeilen bindend ist.

          So, das war jetzt lang. Aber vielleicht versteht man mich jetzt etwas besser

          Grüße,

          pb

          Kommentar

          Lädt...
          X