Kalle_B: JOIN - Denkfehler

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

  1. Mahlzeit,

    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

    Lass mich raten: Du weißt nicht, was ein LEFT JOIN ist bzw. wie er funktioniert?

    MfG,
    EKKi

    --
    sh:( fo:| ch:? rl:( br:> n4:~ ie:% mo:} va:) de:] zu:) fl:{ ss:) ls:& js:|
    1. 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

      1. 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

        --
        -------------------
        sh:| fo:} ch:? rl:( br:& n4:{ ie:| mo:} va:) js:| de:] zu:| fl:( ss:) ls:& (SelfCode)
        Konsens ist kein Beweis  --  John Naisbitt
        1. 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