Nested Set-Pfad horizontal selektiert

Nested Set-Pfad horizontal selektiert

am 15.03.2006 16:10:24 von Kai Ruhnau

Hi,

Ich habe hier ein Nested Set, auf dessen Knoten ich referenziere. Es
sind Artikel, die mit einem Knoten in der Lagerhirarchie verknüpft sind.

Ich hätte jetzt gerne alle Artikel sortiert nach ihrem Lagerort, dessen
Sortierung beginnt bei der Wurzel.
Bzw. auch (für die Ausgabge) zu jedem Artikel seinen Lagerort, also von
der Wurzel ausgehend den Pfad bis zu dem referenzierten Knoten.

Sind diese Fragen beim Nested Set mittels SQL beantwortbar?

Grüße
Kai

Re: Nested Set-Pfad horizontal selektiert

am 20.03.2006 22:49:14 von Dominik Echterbruch

Kai Ruhnau wrote:
>
> Ich habe hier ein Nested Set, auf dessen Knoten ich referenziere. Es
> sind Artikel, die mit einem Knoten in der Lagerhirarchie verknüpft sind.
>
> Ich hätte jetzt gerne alle Artikel sortiert nach ihrem Lagerort, dessen
> Sortierung beginnt bei der Wurzel.
> Bzw. auch (für die Ausgabge) zu jedem Artikel seinen Lagerort, also von
> der Wurzel ausgehend den Pfad bis zu dem referenzierten Knoten.

Sorry, das habe ich jetzt nicht verstanden (und der Rest der Gruppe wohl
auch nicht, sonst gäb's eine Antwort). Kannst du mal ein Beispiel
zeigen, wie das ganze aussieht, und was rauskommen soll?

Grüße,
Dominik

Re: Nested Set-Pfad horizontal selektiert

am 21.03.2006 09:46:13 von Kai Ruhnau

Dominik Echterbruch wrote:
> Kai Ruhnau wrote:
>>
>> Ich habe hier ein Nested Set, auf dessen Knoten ich referenziere. Es
>> sind Artikel, die mit einem Knoten in der Lagerhirarchie verknüpft sind.
>>
>> Ich hätte jetzt gerne alle Artikel sortiert nach ihrem Lagerort,
>> dessen Sortierung beginnt bei der Wurzel.
>> Bzw. auch (für die Ausgabge) zu jedem Artikel seinen Lagerort, also
>> von der Wurzel ausgehend den Pfad bis zu dem referenzierten Knoten.
>
> Sorry, das habe ich jetzt nicht verstanden (und der Rest der Gruppe wohl
> auch nicht, sonst gäb's eine Antwort). Kannst du mal ein Beispiel
> zeigen, wie das ganze aussieht, und was rauskommen soll?

Ich habe als Beispielbaum

ID | Links | Rechts | Bezeichnung
1 | 1 | 8 | Raum
2 | 2 | 7 | Regal
3 | 3 | 6 | Fach
4 | 4 | 5 | Unterteilung

Mein Artikel ist jetzt mit der ID 4 verknüpft, weil er da gelagert wird.

Ich hätte jetzt gerne als einzelnen Wert im Ergebnis den Weg von der
Wurzel, also etwas in der Form 'Raum,Regal,Fach,Unterteilung'
('Unterteilung,Fach,Regal,Raum' wäre auch ok). Das ist dann "Der
Lagerort" des Artikels, den ich dann darstellen kann.

Das wichtige ist, und daran scheitere ich bisher, dass diese Liste
sortiert sein soll bzw. noch ein Sortierbarkeitskriterium enthält, denn
ein Pfad der Art "Regal,Fach,Raum,Unterteilung" hat nicht viel Wert.

Den Pfad in einem einzelnen Feld im Ergebnis zu haben hätte zusätzlich
den Vorteil, danach sortieren zu können (Alle Lagerorte unterhalb von
"Regal" sortiert).

Bisher helfe ich mir damit, dass ich nebeneinander ein Nested Set und
einen Materialized Path halte, mit dem ich soweit klarkomme. Trotzdem
würde mich interessieren, ob das im Nested Set überhaupt geht.

Grüße
Kai

Re: Nested Set-Pfad horizontal selektiert

am 21.03.2006 20:20:03 von Dominik Echterbruch

Kai Ruhnau wrote:
>
> Ich habe als Beispielbaum
>
> ID | Links | Rechts | Bezeichnung
> 1 | 1 | 8 | Raum
> 2 | 2 | 7 | Regal
> 3 | 3 | 6 | Fach
> 4 | 4 | 5 | Unterteilung
>
> Mein Artikel ist jetzt mit der ID 4 verknüpft, weil er da gelagert wird.
>
> Ich hätte jetzt gerne als einzelnen Wert im Ergebnis den Weg von der
> Wurzel, also etwas in der Form 'Raum,Regal,Fach,Unterteilung'
> ('Unterteilung,Fach,Regal,Raum' wäre auch ok). Das ist dann "Der
> Lagerort" des Artikels, den ich dann darstellen kann.

OK, ich glaube das habe ich weitestgehend verstanden. Was ich nicht
verrstehe, ist, warum du dafür das Nested Set Modell gewählt hast. Eine
Tabelle mit den Spalten Raum, Regal, Fach und Unterteilung würde doch
völlig genügen. Aber das ist nur eine Frage am Rande, die dich evtl. zu
einem geschickteren Datenmodell mit weniger Problemen führt.

Mit diesem Modell brauchst du jedenfalls irgendein Kriterium, das für
deinen Pfad immer identisch ist und auf das du gruppieren kannst. Du
erwähnst hier eine Artikelnummer; die kann man ja einfach dazu joinen
und darauf gruppieren. Als Aggregatfunktion muß dann ein GROUP_CONCAT
herhalten, sofern du eine ausreichend aktuelle MySQL-Version hast.

Bleibt das Problem der Sortierung innerhalb der Aggregation. Ich denke
mal, das ist der Punkt, an dem du bereits angekommen und, wie unten
erwähnt, gescheitert bist.
Ist das soweit korrekt?

> Das wichtige ist, und daran scheitere ich bisher, dass diese Liste
> sortiert sein soll bzw. noch ein Sortierbarkeitskriterium enthält, denn
> ein Pfad der Art "Regal,Fach,Raum,Unterteilung" hat nicht viel Wert.
>
> Bisher helfe ich mir damit, dass ich nebeneinander ein Nested Set und
> einen Materialized Path halte, mit dem ich soweit klarkomme. Trotzdem
> würde mich interessieren, ob das im Nested Set überhaupt geht.

Mal davon abgesehen, daß ich dein Datenmodell für sehr ungünstig halte,
könntest du dir mit einem Sub-Select behelfen. Da ich denke, daß du eine
Wert-Spalte in deinem Baum hast, die du nur vergessen hast zu erwähnen,
habe ich sie mal hinzugefügt. Ich habe also folgende Tabellen:

CREATE TABLE baum (
id int unsigned not null auto_increment primary key,
links int unsigned not null,
rechts int unsigned not null,
bezeichnung varchar(255),
wert int unsigned not null
);

CREATE TABLE artikel (
artikelid int unsigned not null auto_increment primary key,
baumid int unsigned references baum.id
);

Damit wäre dann (hoffentlich) eine solche Abfrage möglich:

SELECT a.artikelid,
GROUP_CONCAT(
(
SELECT b1.wert
FROM baum b1
INNER JOIN baum b2 ON b2.links <= b1.links
AND b2.rechts >= b1.rechts
WHERE r.id = a.baumid
ORDER BY l.links
)
)
FROM artikel a
GROUP BY a.artikelid

Passt das zu dem, was du brauchst? Wenn nicht, kannst du den Ansatz ja
vielleicht noch verfeinern und uns dann das Ergebnis präsentieren. Würde
mich interessieren.


Grüße,
Dominik
--
MonstersGame - Die Schlacht zwischen Vampiren und Werwölfen
http://spielwelt6.monstersgame.net/?ac=vid&vid=3018786

Re: Nested Set-Pfad horizontal selektiert

am 21.03.2006 22:38:36 von Kai Ruhnau

Dominik Echterbruch wrote:
> Kai Ruhnau wrote:
>>
>> Ich habe als Beispielbaum
>>
>> ID | Links | Rechts | Bezeichnung
>> 1 | 1 | 8 | Raum
>> 2 | 2 | 7 | Regal
>> 3 | 3 | 6 | Fach
>> 4 | 4 | 5 | Unterteilung
>>
>> Mein Artikel ist jetzt mit der ID 4 verknüpft, weil er da gelagert wird.
>>
>> Ich hätte jetzt gerne als einzelnen Wert im Ergebnis den Weg von der
>> Wurzel, also etwas in der Form 'Raum,Regal,Fach,Unterteilung'
>> ('Unterteilung,Fach,Regal,Raum' wäre auch ok). Das ist dann "Der
>> Lagerort" des Artikels, den ich dann darstellen kann.
>
> OK, ich glaube das habe ich weitestgehend verstanden. Was ich nicht
> verrstehe, ist, warum du dafür das Nested Set Modell gewählt hast. Eine
> Tabelle mit den Spalten Raum, Regal, Fach und Unterteilung würde doch
> völlig genügen. Aber das ist nur eine Frage am Rande, die dich evtl. zu
> einem geschickteren Datenmodell mit weniger Problemen führt.

Ja, bisher war das Datenmodell auch so. Aber zum einen ist damit die
Komplexität der Lagerorganisation begrenzt, zum anderen fand ich es im
Datenmodell doof, wenn ich einen Artikel in einem Raum liegen habe,
dafür einen Datensatz Raum,NULL,NULL,NULL zu haben.

> Mit diesem Modell brauchst du jedenfalls irgendein Kriterium, das für
> deinen Pfad immer identisch ist und auf das du gruppieren kannst. Du
> erwähnst hier eine Artikelnummer; die kann man ja einfach dazu joinen
> und darauf gruppieren. Als Aggregatfunktion muß dann ein GROUP_CONCAT
> herhalten, sofern du eine ausreichend aktuelle MySQL-Version hast.

Ist eine 5.0.19, da mich einige Bugs in 5.0.18 betroffen haben - leider
gibts auch da noch mindestens ein Problem... (Nein Andreas, das war
_keine_ Steilvorlage ;-) )

> Bleibt das Problem der Sortierung innerhalb der Aggregation. Ich denke
> mal, das ist der Punkt, an dem du bereits angekommen und, wie unten
> erwähnt, gescheitert bist.
> Ist das soweit korrekt?

Jap, exakt.

>> Das wichtige ist, und daran scheitere ich bisher, dass diese Liste
>> sortiert sein soll bzw. noch ein Sortierbarkeitskriterium enthält,
>> denn ein Pfad der Art "Regal,Fach,Raum,Unterteilung" hat nicht viel Wert.
>>
>> Bisher helfe ich mir damit, dass ich nebeneinander ein Nested Set und
>> einen Materialized Path halte, mit dem ich soweit klarkomme. Trotzdem
>> würde mich interessieren, ob das im Nested Set überhaupt geht.
>
> Mal davon abgesehen, daß ich dein Datenmodell für sehr ungünstig halte,
> könntest du dir mit einem Sub-Select behelfen.

Ich bin auch inzwischen zu dem Schluss gekommen, dass Materialized Path
deutlich geeigneter ist (ich will die beliebige Tiefe der Lagerstruktur
haben). Ich bin gerade wie gesagt einfach neugierig.

> Da ich denke, daß du eine
> Wert-Spalte in deinem Baum hast, die du nur vergessen hast zu erwähnen,
> habe ich sie mal hinzugefügt. Ich habe also folgende Tabellen:

Ne, die Bezeichnung ist dafür gedacht. Ich habe für das Beispiel nur
sprechende Einträge genommen zur Verdeutlichung.

> CREATE TABLE baum (
> id int unsigned not null auto_increment primary key,
> links int unsigned not null,
> rechts int unsigned not null,
> bezeichnung varchar(255),
> wert int unsigned not null
> );
>
> CREATE TABLE artikel (
> artikelid int unsigned not null auto_increment primary key,
> baumid int unsigned references baum.id
> );
>
> Damit wäre dann (hoffentlich) eine solche Abfrage möglich:
>
> SELECT a.artikelid,
> GROUP_CONCAT(
> (
> SELECT b1.wert
> FROM baum b1
> INNER JOIN baum b2 ON b2.links <= b1.links
> AND b2.rechts >= b1.rechts
> WHERE r.id = a.baumid
> ORDER BY l.links
> )
> )
> FROM artikel a
> GROUP BY a.artikelid
>
> Passt das zu dem, was du brauchst?

Prinzipiell schon. Das ist ein Art der Lösung, die ich in einem anderen
Problem hier[tm] auch schon benutzt hatte. Ich hatte aber auch damals
nichts darüber gefunden, ob garantiert(!) ist, dass die Sortierung
innerhalb des Sub-Selects ihren Weg genau so in die Aggregatsfunktion
findet. Ich mach für die Frage mal nen neuen Thread auf.

> Wenn nicht, kannst du den Ansatz ja
> vielleicht noch verfeinern und uns dann das Ergebnis präsentieren. Würde
> mich interessieren.

Danke für die Antwort.

Grüße
Kai

--
This signature is left as an exercise for the reader.