MIN von mehreren Tabellen
Chris
- datenbank
0 Frank (no reg)0 Chris
0 Ilja
Hi,
ich habe eine Haupttabelle und 3 Nebentabellen die ich allesamt mit JOIN verbinde.
Nun möchte ich ein Wert aus der Haupttabelle mit anderen Werten aus den 3 Nebentabellen vergleichen und dabei den kleinsten Wert rausbekommen und später nochmal mit dem Wert aus der Haupttabelle zu vergleichen.
Angenommen in der Haupttabelle steht in der Spalte "t1_ek" der Wert "400" drin und in den jeweils anderen Tabellen und Spalten folgendes (Spalte Wert): "t2_ek" "300", "t3_ek" "200" und "t4_ek" "100" drin, dann möchte ich den kleinsten Wert von den 3 Nebentabellen mit dem Wert aus der Haupttabelle vergleichen. Der Befehl MIN() funktioniert ja glaube ich nur mit einer Spalte oder?
Also wäre es am Ende dann t1_ek mit "400" und t4_ek mit "100". Diese beiden Werte will ich dann nochmal mit SQL vergleichen und in eine extra Spalte die Differenz der beiden Werte ausgeben lassen.
Ich benutze MySQL 4.0.25
Was ich probiert hatte:
SELECT t1.*, t2.*, t3.*, t4.*,
CASE
WHEN t2_ek<t1_ek AND t2_ek<t3_ek AND t2_ek<t4_ek THEN 'T2'
WHEN t3_ek<t1_ek AND t3_ek<t2_ek AND t3_ek<t4_ek THEN 'T3'
WHEN t4_ek<t1_ek AND t4_ek<t2_ek AND t4_ek<t3_ek THEN 'T4'
END
FROM t1
LEFT JOIN t2 ON t1.herstellernr = t2.herstlnr
LEFT JOIN t3 ON t1.herstellernr = t3.herstnr
LEFT JOIN t4 ON t1.herstellernr = t4.herstlnr
Aber da kann ich ja nur vergleichen und irgendwie komm ich schon nicht mehr weiter.
Grüße
Chris
Hi,
warum verbindest du die 3 Tabellen nicht mittels UNION (ALL)
SELECT feldliste
FROM tabelle1
UNION ALL
SELECT feldlist /* gleiches feldschema wie im ersten SELECT */
FROM tabelle2
UNION ALL
...
Lies dir bitte das Kapitel zu UNION in der Doku deines Datenbanksystems nach.
Grüsse
Frank
Hi
warum verbindest du die 3 Tabellen nicht mittels UNION (ALL)
SELECT feldliste
FROM tabelle1
UNION ALL
SELECT feldlist /* gleiches feldschema wie im ersten SELECT */
FROM tabelle2
UNION ALL
...
>
> Lies dir bitte das Kapitel zu UNION in der Doku deines Datenbanksystems nach.
Hab ich nun gemacht, aber ich versteh den Sinn dahinter nicht was es mir bringen würde? Weil es so ja auch so mit JOIN geht.
Grüße
Chris
yo,
deine version von mysql schließt schon mal unterabfragen aus. insofern hört sich der weg über joins doch recht gut an. es gibt bei mysql eine nützliche funktion die heißt LEAST und gibt dir den kleinsten wert mehrerer argumente zurück. die kannst du verwenden, wobei du darauf achten musst, dass bei nur einem NULL argument die funktion NULL zurückgibt, besonders da du OUTER JOINS bildest. dies kannst du umgehen, indem du wiederrum eine weitere Funktion einsetzt, die NULL in einen für dich beliebigen wert konvertiert, zum beispiel 0. ich weiss im moment nicht aus dem kopf, die diese funktion unter mysql heißt, einfach mal in der doku stöbern.
SELECT t1.*, t2.*, t3.*, t4.*, LEAST(t2_ek, t3_ek, t2_ek) AS Minwert, t1_ek - LEAST(t2_ek, t3_ek, t2_ek) AS Differenz
FROM t1
LEFT JOIN t2 ON t1.herstellernr = t2.herstlnr
LEFT JOIN t3 ON t1.herstellernr = t3.herstnr
LEFT JOIN t4 ON t1.herstellernr = t4.herstlnr
Ilja