Hallo Bernd,
mir fällt auf, dass deine umgebaute Query anders joined als die Originalquery.
alt: kalender_termine.kt_datum = kalender_personal.kp_code
neu: kalender_personal.kp_code = kalender_termine.kt_kalenderID
Das wird wohl der Hauptgrund dafür sein, dass Du auf einmal Treffer bekommst.
Generell solltest Du noch einen EXPLAIN auf deine neue Query machen und Dir merken. Und dann solltest Du
- den LEFT JOIN mit kalender_personal nach vorn ziehen (weil Du darauf einen WHERE ansetzt)
- das LEFT in diesem LEFT JOIN weglassen, weil Du kp_code != "" abfragst, was Sätze abweist, in denen kp_code NULL ist. Die Sätze, die Du durch einen LEFT JOIN zusätzlich bekommst, werden demnach vom WHERE gleich wieder weggefressen.
Also so:
SELECT
kt_kalenderID, kt_datum, kp_id, kp_code, kp_userID, k_code, k_jobNr, k_bezeichnung,
per_anrede, per_name, per_vorname
FROM kalender_termine
JOIN
kalender_personal ON kalender_personal.kp_code = kalender_termine.kt_kalenderID
LEFT JOIN
kalender ON kalender.k_code = kalender_termine.kt_kalenderID
LEFT JOIN
personal ON personal.per_code = kalender_personal.kp_userID
WHERE
kt_datum = '2019-05-26'
AND kp_userID != ""
ORDER by test ASC
Du kannst Dich dann auch noch fragen, ob die Beziehung kalender_termine -> kalender tatsächlich optional ist (sprich: ob es kt_kalenderIDs geben kann, zu denen Du keinen k_code findest). Die gleiche Frage wäre für die Beziehung kalender_personal -> personal zu stellen. Wenn die Namen deiner Tabellen gut gewählt sind, würde ich annehmen, dass diese Beziehungen obligatorisch sind. Und dann kann das LEFT da weg.
Nachdem Du unnötige LEFT entfernt hast, solltest Du nochmal einen EXPLAIN machen und gucken ob der gewählte Zugriff besser geworden ist.
Ach ja, natürlich sollten die Spalten kp_code, k_code und per_code in einem Index zu finden sein, damit die JOINs nicht zu Table- oder Index-Scans führen. Aber das weißt Du sicherlich schon.
Rolf
sumpsi - posui - clusi