MySQL - 2 Tabellen Joinen? = Verlaufstabelle

k3nguruh

Erfahrenes Mitglied
Hallo,

Ich weiß gar nicht wie ich es genau beschreiben soll. Deshab habe ich mal ein Bild gemacht, damit es vll. verständlicher wird.
Es sollen jedenfalls 2 (stark vereinfachte) Tabellen zusammengefügt werden und somit einen Verlauf darstellen. Wobei die `kid` den Zusammenhang darstellt.

Bitte schaut euch das Bild an. Ich werde dann auf mögliche Fragen antworten.

Sorry, aber ich kann es wirklich so nicht beschreiben.
 

Anhänge

  • fahrzeug+besatzung.PNG
    fahrzeug+besatzung.PNG
    28,6 KB · Aufrufe: 8
Zuletzt bearbeitet:
Überschneidende Perioden. Ein Klassiker
[SQL] Perioden vergleichen [Yaslaw.Info]
Test zum folgenden Code: DB Fiddle - SQL Database Playground

SQL:
select *
from T1, T2
where T1.kid = T2.kid
and LEAST(IFNULL(T2.ende_datumzeit, SYSDATE()), IFNULL(T1.ende_datumzeit, SYSDATE()))
    >= GREATEST(T2.start_datumzeit, T1.start_datumzeit)

Und so werweitert hast du auch die Datums, so wie du sie haben willst
DB Fiddle - SQL Database Playground
SQL:
select T1.kid, T1.kosten, T2.anzahl,
    GREATEST(T2.start_datumzeit, T1.start_datumzeit) as start_dt,
    LEAST(IFNULL(T2.ende_datumzeit, SYSDATE()), IFNULL(T1.ende_datumzeit, SYSDATE())) AS end_dt
from T1, T2
where T1.kid = T2.kid
and LEAST(IFNULL(T2.ende_datumzeit, SYSDATE()), IFNULL(T1.ende_datumzeit, SYSDATE())) >= GREATEST(T2.start_datumzeit, T1.start_datumzeit)
 
Zuletzt bearbeitet:
Hallo,

das kommt meinem Wunsch schon ganz naha. Es gibt aber auf den ersten Blick noch Zeilen die dort nicht hingehören. Ich habe die mal gelb markiert.

Ich bastle ein bisschen an deinem Code umher. Aber su wirst bestimmt schneller sein. ;-)


P.S.: und das letzte end_dt müsste eigentlich NULL sein
 

Anhänge

  • Unbenannt.PNG
    Unbenannt.PNG
    27,8 KB · Aufrufe: 3
Ich habe deinen Code etwas verändert. Anscheinend scheint es zu funktionieren. Jedenfalls bei meinen Stichproben.


SQL:
select
  T1.kid,
  T1.kosten,
  T2.anzahl,
  GREATEST(T2.start_datumzeit, T1.start_datumzeit) as start_dt,

  -- das zweite SYSDATE() durch T2.`end_datumzeit` ersetzt
  -- LEAST(IFNULL(T2.ende_datumzeit, SYSDATE()), IFNULL(T1.ende_datumzeit, SYSDATE())) AS end_dt
    LEAST(IFNULL(T2.ende_datumzeit, SYSDATE()), IFNULL(T1.end_datumzeit, T2.end_datumzeit)) AS end_dt
from
  T1,
  T2
where
  T1.kid = T2.kid
  and
 
  -- aus >= wird ein >
  -- LEAST(IFNULL(T2.ende_datumzeit, SYSDATE()), IFNULL(T1.ende_datumzeit, SYSDATE())) >= GREATEST(T2.start_datumzeit, T1.start_datumzeit)
  LEAST(IFNULL(T2.ende_datumzeit, SYSDATE()), IFNULL(T1.ende_datumzeit, SYSDATE())) > GREATEST(T2.start_datumzeit, T1.start_datumzeit)

nochmals besten Dank.
 
Zuletzt bearbeitet:

Neue Beiträge

Zurück