mysql: Left Join an dieser Stelle?
bearbeitet von JörgHallo Rolf,
> Hm. So langsam beginne ich, den Überblick zu verlieren - bzw. ich habe ihn offenbar noch nie gehabt. Denn mir fällt jetzt ein möglicher Defekt auf.
>
Da ist definitiv noch etwas nicht so, wie gewünscht.
Denn der LEFT JOIN zur sonder-Tabelle gibt mir teilweise noch nicht die korrekte Kategorie aus.
> Du hast die Datümer in alledaten.
>
Ja.
ID(int,autoincremnt)
Datum(date)
Wochentag(varchar)
> Da mischst Du mit LEFT JOIN Sätze hinzu, die zu einem bestimmten User gehören. Aus der Stunden-Tabelle die vom Datum, aus der Sonder-Tabelle die, deren Datumsintervall das Datum einschließt.
>
Genau.
> Heißt doch eigentlich: Zwischen Stunden und Sonder gibt es überhaupt keinen Bezug - außer der User-ID. Aber das könnte zu wenig sein.
>
User-ID und ggf. Datum, wenn es zwischen Start und End liegt.
> Wenn man deine Daten nicht kennt, ist es ja so, dass Du zu einem Datum x Sätze in der Stundentabelle und y Sätze in der Sondertabelle finden kannst. x und y sind Zahlen von 0 bis N. In dem Moment, wo x>1 UND y>1 wird, bekommst Du alle möglichen Kombinationen dieser Sätze geliefert.
>
Ok. Deshalb an dieser Stelle:
X kann 0, 1 oder n sein.
Y kann auch 0,1 oder n sein.
> Fall 1: Das ist okay so und deine Auswertung kommt damit klar.
>
Wenn die Ergebnismenge aus meiner Abfrage stimmen würde, würde meine Auswertung damit klar kommen (müssen).
Ich hadere also doch immer noch mir meiner Query.
**Edit an dieser Stelle (manchmal hilft das Schreiben eines Post bei der Lösung - hier wieder geschehen):**
Ich habe den LEFTJOIN der Sondertabelle wieder falsch gemacht, auch dort muss ich auf den User dieser Tabelle Bezug nehmen!!
Also:
~~~
SELECT
s.Kategorie,
a.Datum
FROM
alletage a
LEFT JOIN stunden STD ON
(
a.Datum = STD.Datum AND s.User = 'xyz'
)
LEFT JOIN _436sdw_zz_sonder s ON
(
a.Datum BETWEEN s.Start AND s.End AND STD.User = 'xyz'
)
WHERE
a.Datum BETWEEN '2021-04-01' AND '2021-04-30'
ORDER BY
`a`.`Datum` ASC
~~~
Das scheint mir von der Abfrage her das gewünschte Ergebnis zu bringen.
....
Habs gerade nochmal in den Echtdaten ausprobiert, die Ergebnismenge sieht sehr aus, wie mein gewünschtes Ergebnis ☺️
Siehst du denn noch irgendwo einen möglichen Defekt?
Jörg
mysql: Left Join an dieser Stelle?
bearbeitet von JörgHallo Rolf,
> Hm. So langsam beginne ich, den Überblick zu verlieren - bzw. ich habe ihn offenbar noch nie gehabt. Denn mir fällt jetzt ein möglicher Defekt auf.
>
Da ist definitiv noch etwas nicht so, wie gewünscht.
Denn der LEFT JOIN zur sonder-Tabelle gibt mir teilweise noch nicht die korrekte Kategorie aus.
> Du hast die Datümer in alledaten.
>
Ja.
ID(int,autoincremnt)
Datum(date)
Wochentag(varchar)
> Da mischst Du mit LEFT JOIN Sätze hinzu, die zu einem bestimmten User gehören. Aus der Stunden-Tabelle die vom Datum, aus der Sonder-Tabelle die, deren Datumsintervall das Datum einschließt.
>
Genau.
> Heißt doch eigentlich: Zwischen Stunden und Sonder gibt es überhaupt keinen Bezug - außer der User-ID. Aber das könnte zu wenig sein.
>
User-ID und ggf. Datum, wenn es zwischen Satrt und End liegt.
> Wenn man deine Daten nicht kennt, ist es ja so, dass Du zu einem Datum x Sätze in der Stundentabelle und y Sätze in der Sondertabelle finden kannst. x und y sind Zahlen von 0 bis N. In dem Moment, wo x>1 UND y>1 wird, bekommst Du alle möglichen Kombinationen dieser Sätze geliefert.
>
Ok. Deshalb an dieser Stelle:
X kann 0, 1 oder n sein.
Y kann auch 0,1 oder n sein.
> Fall 1: Das ist okay so und deine Auswertung kommt damit klar.
>
Wenn die Ergebnismenge aus meiner Abfrage stimmen würde, würde meine Auswertung damit klar kommen (müssen).
Ich hadere also doch immer noch mir meiner Query.
**Edit an dieser Stelle (manchmal hilft das Schreiben eines Post bei der Lösung - hier wieder geschehen):**
Ich habe den LEFTJOIN der Sondertabelle wieder falsch gemacht, auch dort muss ich auf den User dieser Tabelle Bezug nehmen!!
Also:
~~~
SELECT
s.Kategorie,
a.Datum
FROM
alletage a
LEFT JOIN stunden STD ON
(
a.Datum = STD.Datum AND s.User = 'xyz'
)
LEFT JOIN _436sdw_zz_sonder s ON
(
a.Datum BETWEEN s.Start AND s.End AND STD.User = 'xyz'
)
WHERE
a.Datum BETWEEN '2021-04-01' AND '2021-04-30'
ORDER BY
`a`.`Datum` ASC
~~~
Das scheint mir von der Abfrage her das gewünschte Ergebnis zu bringen.
....
Habs gerade nochmal in den Echtdaten ausprobiert, die Ergebnismenge sieht sehr aus, wie mein gewünschtes Ergebnis ☺️
Siehst du denn noch irgendwo einen möglichen Defekt?
Jörg
mysql: Left Join an dieser Stelle?
bearbeitet von JörgHallo Rolf,
> Hm. So langsam beginne ich, den Überblick zu verlieren - bzw. ich habe ihn offenbar noch nie gehabt. Denn mir fällt jetzt ein möglicher Defekt auf.
>
Da ist definitiv noch etwas nicht so, wie gewünscht.
Denn der LEFT JOIN zur sonder-Tabelle gibt mir teilweise noch nicht die korrekte Kategorie aus.
> Du hast die Datümer in alledaten.
>
Ja.
ID(int,autoincremnt)
Datum(date)
Wochentag(varchar)
> Da mischst Du mit LEFT JOIN Sätze hinzu, die zu einem bestimmten User gehören. Aus der Stunden-Tabelle die vom Datum, aus der Sonder-Tabelle die, deren Datumsintervall das Datum einschließt.
>
Genau.
> Heißt doch eigentlich: Zwischen Stunden und Sonder gibt es überhaupt keinen Bezug - außer der User-ID. Aber das könnte zu wenig sein.
>
User-ID und ggf. Datum, wenn es zwischen Satrt und End liegt.
> Wenn man deine Daten nicht kennt, ist es ja so, dass Du zu einem Datum x Sätze in der Stundentabelle und y Sätze in der Sondertabelle finden kannst. x und y sind Zahlen von 0 bis N. In dem Moment, wo x>1 UND y>1 wird, bekommst Du alle möglichen Kombinationen dieser Sätze geliefert.
>
Ok. Deshalb an dieser Stelle:
X kann 0, 1 oder n sein.
Y kann auch 0,1 oder n sein.
> Fall 1: Das ist okay so und deine Auswertung kommt damit klar.
>
Wenn die Ergebnismenge aus meiner Abfrage stimmen würde, würde meine Auswertung damit klar kommen (müssen).
Ich hadere also doch immer noch mir meiner Query.
**Edit an dieser Stelle (manchmal hilft das Schreiben eines Post bei der Lösung - hier wieder geschehen):**
Ich habe den LEFTJOIN der Sondertabelle wieder falsch gemacht, auch dort muss ich auf den User dieser Tabelle Bezug nehmen!!
Also:
~~~
SELECT
s.Kategorie,
a.Datum
FROM
alletage a
LEFT JOIN stunden STD ON
(
a.Datum = STD.Datum AND s.User = 'xyz'
)
LEFT JOIN _436sdw_zz_sonder s ON
(
a.Datum BETWEEN s.Start AND s.End AND STD.User = 'xyz'
)
WHERE
a.Datum BETWEEN '2021-04-01' AND '2021-04-30'
ORDER BY
`a`.`Datum` ASC
~~~
Das scheint mir von der Abfrage her das gewünschte Ergebnis zu bringen.
....
Habs gerade nochmal in den Echtdaten ausprobiert, die Ergebnismenge sieht sehr aus, wie mein gewünschtes Ergebnis ☺️
Siehst du denn noch irgendwo einen möglichen Defekt?
Jörg