Autor Beitrag
Aya
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 1964
Erhaltene Danke: 15

MacOSX 10.6.7
Xcode / C++
BeitragVerfasst: Mi 23.06.10 17:05 
Hi,

ich hab ein SQL Problem, wo ich grad etwas auf dem Schlauch stehe.

Ich habe eine Tabelle "Master", eine "Child" und eine "Outputs" Tabelle.

Ein Eintrag in der Child-Tabelle gehört immer zu nur einem einzigen Master, aber ein Master kann beliebig viele Childs haben. (1:n verknüpfung)
Genauso mit der Outputs-Tabelle, ein Output gehört immer zu einem Child, aber ein Child kann beliebig viele Outputs haben.

Die verknüfungen sind über je eine connection-tabelle gelöst in der einfach die 2 Primary-Key-IDs der Tabellen stehen.

Ich habe also diese Tabellen:

ausblenden Quelltext
1:
2:
3:
4:
5:
Master
Master_Child_Connection
Child
Child_Output_Connection
Output


Die ID-Spalten heißen immer wie die Tabelle, nur mit "id_" davor (id_Master, id_Child, id_Output).


So, ich möchte jetzt eine SQL Abfrage machen in der ich eine ID von einem Master als WHERE Angeben kann und alle Outputs erhalte die über die Childs mit dem Master verknüpft sind.
Die Childs bekommen ist ja kein Problem, das geht einfach via:

ausblenden SQL-Anweisung
1:
SELECT * FROM Child JOIN(Master_Child_Connection) USING(`id_Child`) JOIN(Master) USING(`id_Master`) WHERE `id_Master` = 42					


Klar könnte ich jetzt hergehen und für jedes Child im Ergebnis der Abfrage wiederrum eine SQL-Abfrage machen.. aber das können dann echt viele werden, und das würde ich gern vermeiden. Nur... geht das?



Und eine andere Problemstellung wäre eine eine art Baumstruktur.
Die Outputs können beliebig viele Outputs als "Input" haben. Also ein Output gehört zu einem Child, setzt sich aber aus vielen Outputs anderer Childs zusammen.
Es ergibt also einen Baum der am ende auf einen Output zuläuft.

Jetzt würde ich gern eine Abfrage machen wo ich nur eine OutputID angebe und ALLE Inputs im Baum erhalte..
Meine aktuelle lösung ist wieder ganz viele einzel-Querys zu machen, aber das ist eben nur bedingt gut...

Hat da irgendwer eine Idee?

Aya

_________________
Aya
I aim for my endless dreams and I know they will come true!
BenBE
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 8721
Erhaltene Danke: 191

Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
BeitragVerfasst: Mi 23.06.10 17:44 
user profile iconAya hat folgendes geschrieben Zum zitierten Posting springen:
Hi,

ich hab ein SQL Problem, wo ich grad etwas auf dem Schlauch stehe.

Ahhh, Okay?!

[Drop]

user profile iconAya hat folgendes geschrieben Zum zitierten Posting springen:
Ich habe also diese Tabellen:

ausblenden Quelltext
1:
2:
3:
4:
5:
Master
Master_Child_Connection
Child
Child_Output_Connection
Output


Die ID-Spalten heißen immer wie die Tabelle, nur mit "id_" davor (id_Master, id_Child, id_Output).

Okay ...

user profile iconAya hat folgendes geschrieben Zum zitierten Posting springen:
So, ich möchte jetzt eine SQL Abfrage machen in der ich eine ID von einem Master als WHERE Angeben kann und alle Outputs erhalte die über die Childs mit dem Master verknüpft sind.
Die Childs bekommen ist ja kein Problem, das geht einfach via:

ausblenden SQL-Anweisung
1:
SELECT * FROM Child JOIN(Master_Child_Connection) USING(`id_Child`) JOIN(Master) USING(`id_Master`) WHERE `id_Master` = 42					


Klar könnte ich jetzt hergehen und für jedes Child im Ergebnis der Abfrage wiederrum eine SQL-Abfrage machen.. aber das können dann echt viele werden, und das würde ich gern vermeiden. Nur... geht das?

Ja, das geht.

[Drop]

user profile iconAya hat folgendes geschrieben Zum zitierten Posting springen:
Hat da irgendwer eine Idee?

Aya

Ja, hat irgendwer sicherlich.

Okay, Aber NUR weil Du's bist :mrgreen:

ausblenden SQL-Anweisung
1:
2:
3:
4:
SELECT o.* FROM outputs, clients, master
WHERE outputs.client = clients.id
AND clients.master = master.id
AND master.id = :DeineMasterIDNachDerDuSuchst


Die INNER JOINS da drauß zu bauen dürftest ja hinbekommen ;-)

P.S.: Deine Verknüpfungstabellen brauchst nur für n:m-Beziehungen; für 1:n optimiert man die meist wie gezeigt raus.

_________________
Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
Aya Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 1964
Erhaltene Danke: 15

MacOSX 10.6.7
Xcode / C++
BeitragVerfasst: Mi 23.06.10 18:06 
Hi,

ich hab noch einen fehler gemacht in der Beschreibung, die Outputs sind nicht via 1:n verknüpft, sondern via n:m.

Child : Output = 1:n
Output : Output = n:m

Hab hier mal ne kleine Grafik gemacht die das ganze verdeutlichen soll:
sql

@BenBE:
Deine verknüfte SELECT abfrage werd ich mal ausprobieren, aber bei dem n:m problem, um zu einem Child ALLE Outputs (blauen punkte in der Grafik) zu bekommen dürfte das leider nicht helfen glaube ich.

Aber um das ganze nochmal genau zu formulieren :roll:
WIE kann ich eine solche Abfrage realisieren, ohne das ich 100 Abfragen nacheinander machen muß.

Danke,
Aya
Einloggen, um Attachments anzusehen!
_________________
Aya
I aim for my endless dreams and I know they will come true!
BenBE
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 8721
Erhaltene Danke: 191

Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
BeitragVerfasst: Mi 23.06.10 18:19 
ausblenden SQL-Anweisung
1:
2:
WHERE outputs.parent IN (523425191337
AND NOT (outputs.parent IN (Liste der vorigen Ebene))


Für Oracle würdest Du hier Hierarchische Selects hernehmen; die kann MySQL AFAIK aber nicht.

Die zweite Zeile fällt für die erste Ebene raus; ansonsten ist das halt einfach die Liste aller Parents, die Du bei der Abfrage zuvor erhalten hast.

_________________
Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
Aya Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 1964
Erhaltene Danke: 15

MacOSX 10.6.7
Xcode / C++
BeitragVerfasst: Mi 23.06.10 18:25 
user profile iconBenBE hat folgendes geschrieben Zum zitierten Posting springen:
ausblenden SQL-Anweisung
1:
2:
WHERE outputs.parent IN (523425191337
AND NOT (outputs.parent IN (Liste der vorigen Ebene))


Für Oracle würdest Du hier Hierarchische Selects hernehmen; die kann MySQL AFAIK aber nicht.

Die zweite Zeile fällt für die erste Ebene raus; ansonsten ist das halt einfach die Liste aller Parents, die Du bei der Abfrage zuvor erhalten hast.

Aber auch diese Abfrage müßte ich für jede Ebene einmal ausführen, oder seh ich das falsch?
Also wenn der Baum 5 ebenen tief geht, müßte ich mit deiner Abfrage auch 5 abfragen machen.

_________________
Aya
I aim for my endless dreams and I know they will come true!
BenBE
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 8721
Erhaltene Danke: 191

Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
BeitragVerfasst: Mi 23.06.10 19:55 
Richtig. DAs ist aber immer noch besser, als für jeden Knoten im Baum die Abfrage einmal auszuführen ...

Wie gesagt: MySQL fehlt hier der Support für Hierarchische Selects ...

_________________
Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.