Maximaler Wert für Spalte ermitteln

Lord Luxor

Neuer Benutzer
Beiträge
4
Hallo,
ich will mal mein Problem beschreiben, ich hoffe ich kann das korrekt rüber bringen.

Ich habe vier Tabellen:
Informationenscluster, mit den Spalten id, integrity, confidential
Prozesse, mit den Spalten id, integrity, confidential, availability
Proz_Inf mit den Spalten id, proz_id, inf_id

Die Spalten proz_id und inf_id habe ich per foreign key jeweils mit der Spalte id der Tabellen Informationen und Prozesse verknüpft.

In den Spalten integrity und confidential sind Werte von 1-4 (INT) gespeichert.

Die vierte Tabelle dient der Übersetzung der Werte 1-4 in vom Benutzer gewählte Kategorien:
Schutzbedarfkategorien, mit den Spalten id, kategorie

Nebenbei sind die Spalten integrity und confidential aus Informationscluster und Prozesse jeweils mit foreign key mit der id aus der Tabelle Schutzbedarfkategorien verknüpft.

Folgender Hintergrund:
Prozesse können aus den Informationen, die im Prozess verarbeitet werden die Integrität (integrity) bzw. die Vertraulichkeit (confidential) nach dem Maximalprinzip erben. Nicht wundern, weil es bei Informationen keine Verfügbarkeit gibt, die wird dem Prozess aus einer anderen Quelle zugetragen.
Die Prozesse werden 1:n mit den Informationen über die Tabelle Proz_Inf verknüpft.

Ich möchte nun für Prozess 1, der mit den Informationen 1,2 und 3 verknüpft ist, den jeweiligen maximalen Wert für die drei Informationen in den Spalten integrity und confidential ermitteln. Das möchte ich in einer Abfrage erledigen.

SELECT proz.id, max(ic.integrity), max(ic.confidential) FROM prozesse AS proz left join proz_inf as proz_inf ON (proz.id = proz_inf.proz_id) LEFT JOIN informationscluster AS ic ON (proz_inf.inf_id = ic.id) WHERE proz.id = 1

So bekomme ich die entsprechenden Maximalwerte der Spalten.
Woran ich scheitere ist, wie bekomme ich noch die vierte Tabelle mit eingebunden, damit er mir die entsprechenden Kategorien für die Maximalwerte ausgibt?

Irgendein Tipp?

Bye
Markus
 
Werbung:
Na, wenn Du ein ordentliches Create Statement mit den üblichen Referentiellen Integritäten angegeben hättest, könnte man jetzt relativ eindeutig anworten.
Aber so:
Du musst in Dein Statemen da wo nötig einen Join auf die Kategorietabelle machen. Da es so klingt, dass sie mehrfach verwendet wird, dann halt mehrfach einjoinen für jede Kategegorie, die Du explizit ausgeben willst. Dazu verwendet man dann Table Aliase, die die eindeutige Ansprache trotz identischer Basistabelle erlauben.
 
Zusätzlich zu @dabadepdu : Dein Select ist syntaktisch falsch, es fehlt das GROUP BY, was zwingend bei Aggregationen ist. MySQL erkennt den Fehler nicht und liefert stattdessen ein zufälliges Ergebniss. Müll halt.
 
Ah, Danke. Muss ich mal testen. Bin noch nicht so ganz firm, was solche Konstrukte angeht.
Bei dem Joinen der Kategorien-Tabelle, das hatte ich schon ausprobiert, da bin ich immer auf den Fehler aufgelaufen, dass ich beim ON versucht habe MAX mit einzuhauen, also ON (MAX(ic.confidential) = sbc.id), [sbc ist der Alias der Kategorien-Tabelle für den confidential-Wert] aber das gab immer einen Invalid use of group function.

Aber irgendwie muss ich ja den Maximalwert für die Spalte ic.confidential an die Kategorien-Tabelle in dem Join zuweisen. Ich versteh es einfach nicht, wie ich da hin komme.

Beim GROUP BY, muss ich das dann die Gruppierung auf die Spalte der Kategorien-Tabelle setzen?

Bye
Markus
 
Werbung:
zum Group by:
Was immer Du selektierst, die nicht aggregierten Spalten müssen gruppiert werden, also in die Group by Clause. Das ist eine Faustregel, die in 98% der Fälle passt, sicher auch bei Dir.
 
Zurück
Oben