Hallo Jörg,
Kannst Du mir mal nen Dump Deiner Tabellen geben?
Das bringt kaum was - eine Tabelle mit Datümern vom 1.1.2020 bis 31.12.2022 und eine Mini-Tabelle aus datum, user und Stundenzahl mit 3 Einträgen drin.
Aber - Mist - den WHERE hab ich übersehen. Das hatte ich als Teil der ON Bedingung gelesen.
Ein WHERE wird nach den JOINs durchgeführt und schmeißt deswegen die Rows raus, wo der User NULL ist.
Filtere den User mal vorne, beim Join von alletage und stunden. Dann wird das nur auf die Stundentabelle angewendet.
Den Datums-Bereich kannst Du im WHERE belassen. Er müsste aber auch als Teil der ON-Bedingung funktionieren; ggf. sogar performanter, aber das müsste man messen bzw. mit EXPLAIN untersuchen. Das kann ich bei mir nicht, meine DB ist zu klein und mein MySQL wird deshalb anders optimieren.
SELECT
STD.Datum,
a.Datum
FROM
alletage a
LEFT JOIN stunden STD ON
a.Datum = STD.Datum AND STD.Datum
AND STD.User='xyz'
WHERE
a.Datum BETWEEN '2021-04-01' AND '2021-04-30'
ORDER BY
STD.Datum ASC
Beim Zumischen der Sonder-Tabelle brauchst keinen Vergleich des Users mit den $_POST Daten. Denke ich jedenfalls. Denn da hast Du ja eh schon std.user = s.user im ON.
Rolf
sumpsi - posui - obstruxi