Rolf B: mysql: Left Join an dieser Stelle?

Beitrag lesen

Hallo Jörg,

SQL Queries operieren ausschließlich auf den Daten, die sie vorfinden.

Wenn der 03.10.2021 in keiner der Tabellen vorkommt, findet der Tag der Deutschen Einheit in deiner Liste nicht statt.

Ab MySQL8 oder MariaDB 10.2.1 könnte man es mit einer rekursiven CTE versuchen (WITH Befehl). Davor wirst Du Dir mit einer temporären Table behelfen müssen, die die benötigten Tage enthält. Dafür schreibst Du am besten eine Stored Procedure, denn darin kannst Du Schleifenbefehle verwenden:

delimiter //
create procedure createDays(anfang DATE, ende DATE)
begin
  drop temporary table if exists days;
  create temporary table days (datum date) engine memory;
  while (anfang <= ende) do
     insert into days(datum) values(anfang);
     set anfang = date_add(anfang, interval 1 day);
  end while;
end //
delimiter;

Die Delimiter-Story ist wichtig, weil Du sonst mit einen ; den create procedure beendest. Argh…

Den Namen für die Temp-Tabelle kannst Du nicht als Parameter verwenden. D.h. du kannst schon, müsstest dann in der Prozedur aber mit dynamischem SQL hantieren (PREPARE / EXECUTE), das könnte das Tempo wieder drosseln. Ich habe es nicht ausprobiert.

Wichtig ist auch "ENGINE MEMORY", andernfalls ist das laaaangsam. Oder Du stellst sicher, dass dein SQL Server für default_tmp_storage_engine die Einstellung "MEMORY" hat. Bei mir war's InnoDB und ich hab mich gewundert, warum er nur 30 Inserts pro Sekunde machte.

Wenn Du dann deine Query machst, rufst Du erstmal die Stored Procedure auf, um die days-Tabelle mit dem gewünschten Intervall zu befüllen, und kannst dann die days-Tabelle als führende Tabelle für deinen Join verwenden.

Gerne lasse ich mich von MYSQL Experten einer besseren Lösung belehren 😀

Rolf

--
sumpsi - posui - obstruxi