Chris: MIN von mehreren Tabellen

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

  1. 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

    1. 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
      
  2. 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