Jörg: mysql: Left Join an dieser Stelle?

Beitrag lesen

Hallo Rolf,

ich hab grad mal angefangen, Testtabellen aufzubauen.

Kannst Du mir mal nen Dump Deiner Tabellen geben?

Test 1: Datum und Stunden.

LEFT JOIN ergibt zuerst alle Rows, wo die Stunden-Table nicht null ist. Die null-Rows dahinter.

Der Optimizer hat also offenbar beschlossen, primär über die Stundentabelle zu laufen und die Datumstabelle zuzumischen. Das mag an der Verteilung der Datenzeilen liegen (1000 Zeilen für 3 Jahre und 3 Zeilen in den Stunden). Jedenfalls brauchte ich einen ORDER BY um die Datümer in die richtige Ordnung zu bringen.

Ist das bei Dir vielleicht auch so? Und Du hast so viele befüllte Datenzeilen, dass die Null-Zeilen außer Sicht sind?

Nein, ich habe ja auf einen Monat reduziert, daher kann ich mir alle Zeilen anschauen.

Wenn sie echt fehlen: ich würde so vorgehen wie ich im phpmyadmin (oder was Du verwendest) Schritt für Schritt aufbauen. Erst nur die Datums-Tabelle, dann die Stunden dazu, dann die Sonder-Tabelle.

Ich verwende auch phpmyadmin. Und genauso habe ichs versucht. Einfach nur einen einzigen LEFT JOIN auf die Stunden. Hat schon nicht funktioniert.

Eine Frage nebenbei: Wenn Du die Abfrage auf std.User in die ON-Bedingung für tabelle_sonder hängst, dann bekommst Du (solltest Du bekommen) die tabelle_stunden-Einträge für alle User und nur die Sonder-Einträge werden auf den genannten User limitiert. Ist das das, was Du willst?

Ich limitiere eigentlich 2 x auf den User. 1x in der on-Bedingung und 1x in der WHERE-Bedingung der Query.

SELECT
    STD.Datum,
    a.Datum
FROM
    alletage a
LEFT JOIN stunden STD ON
    a.Datum = STD.Datum
WHERE
    STD.Datum BETWEEN '2021-04-01' AND '2021-04-30' AND STD.User='xyz'
ORDER BY
    STD.Datum ASC

Und ich fürchte, genau zweitere lässt meine Query meine Ergebnismange so reduzieren.

Jörg