JOIN - Denkfehler
Kalle_B
- datenbank
Hallöle,
wenn ich nur den ersten JOIN habe, ist anw_personen = 140. Kommt der zweite JOIN dazu, wird anw_personen = 22400.
Ich möchte natürlich, dass anw_personen gleich bleibt und der zweite JOIN mir anw_personen_vorjahr gibt. Wo ist der Denkfehler?
[lang=sql]SELECT
slt1.id
,slt1.nr
,slt1.datum
,slt1.tag_nr
,slt1.uhr_von
,slt1.uhr_bis
,slt1.autom_setzen
,count(anw1.slot_nr) anw_personen
,count(anw2.slot_nr) anw_personen_vorjahr
FROM tm_slots AS slt1
LEFT JOIN tm_anwesenheit AS anw1
ON anw1.owner_id=slt1.owner_id AND anw1.slot_nr=slt1.nr
LEFT JOIN tm_anwesenheit AS anw2
ON anw2.owner_id=3 AND anw2.slot_nr=slt1.nr
WHERE slt1.owner_id=4
GROUP BY nr[/lang]
Lieben Gruß, Kalle
Mahlzeit,
LEFT JOIN tm_anwesenheit AS anw1
ON anw1.owner_id=slt1.owner_id AND anw1.slot_nr=slt1.nrLEFT JOIN tm_anwesenheit AS anw2
ON anw2.owner_id=3 AND anw2.slot_nr=slt1.nr
Lass mich raten: Du weißt nicht, was ein LEFT JOIN ist bzw. wie er funktioniert?
MfG,
EKKi
Hallo, EKKi,
Lass mich raten: Du weißt nicht, was ein LEFT JOIN ist bzw. wie er funktioniert?
Sorry, ich bin seit 8 Monaten nicht mehr am Thema. Habe den DISTINCT ergänzt, bekomme jetzt die richtigen Zahlen.
Allerdings erhöht sich die Laufzeit von 0,05 sec auf 32,71 sec.
SELECT
slt1.id
,slt1.nr
,slt1.datum
,slt1.tag_nr
,slt1.uhr_von
,slt1.uhr_bis
,slt1.autom_setzen
,count(DISTINCT anw1.adr_id) anw_personen
,count(DISTINCT anw2.adr_id) anw_personen_vorjahr
FROM tm_slots AS slt1
LEFT JOIN tm_anwesenheit AS anw1
ON anw1.owner_id=slt1.owner_id AND anw1.slot_nr=slt1.nr
LEFT JOIN tm_anwesenheit AS anw2
ON anw2.owner_id=3 AND anw2.slot_nr=slt1.nr
WHERE slt1.owner_id=4
GROUP BY nr
LG, Kalle
Hello,
SELECT
slt1.id
,slt1.nr
,slt1.datum
,slt1.tag_nr
,slt1.uhr_von
,slt1.uhr_bis
,slt1.autom_setzen
,count(DISTINCT anw1.adr_id) anw_personen
,count(DISTINCT anw2.adr_id) anw_personen_vorjahr
GROUP BY nr
lass mich raten: MySQL?
Dein Statement würde allen anderen DBMS außer MySQL übelst aufstoßen, weil die Spalten id, datum, tag_nr, uhr_von, uhr_bis, autom_setzen weder von einer Aggregatsfunktion (COUNT, SUM, ...) umgeben sind, noch im GROUP BY auftauchen. Bitte gewöhne dir das ab...
Was deine Performance angeht, hmh, vielleicht löst sich das Problem nachdem du die Gruppierung entsprechend angepasst hast.
MfG
Rouven
Hello,
lass mich raten: MySQL?
Ja.
Dein Statement würde allen anderen DBMS außer MySQL übelst aufstoßen, weil die Spalten id, datum, tag_nr, uhr_von, uhr_bis, autom_setzen weder von einer Aggregatsfunktion (COUNT, SUM, ...) umgeben sind, noch im GROUP BY auftauchen. Bitte gewöhne dir das ab...
Was deine Performance angeht, hmh, vielleicht löst sich das Problem nachdem du die Gruppierung entsprechend angepasst hast.
Habe deinen Vorschlag bei GROUP BY lobend erwähnt, wird aber nicht schneller.
Hole mir dir Vorjahresdaten in einer getrennten SQL Abfrage. Da verdoppelt sich die Programmlaufzeit von 0,05 auf 0,11 sec. Damit kann ich leben.
LG, Kalle