Fabienne: Mysql: Probleme mit SELECT SUM()

Hallo zusammen,

ich habe folgende Tabellen:

user
id | user_name
1  | Max
2  | Franz

kunden
id | name
1  | Müller
2  | Meier
3  | XXX

besuche
user_id | kunden_id | datum
1 | 1 | 2008-12-01
1 | 2 | 2008-12-01
2 | 3 | 2008-12-08
1 | 1 | 2008-12-10
1 | 3 | 2008-12-10

Heißt: Mein User Max hat am 1.12 den Kunden Müller und Meier besucht, am 8.12. tätigt sein Kollege Max den BEsuch beim XXX und am 10.12. besucht wiederum Max den Müller und XXX

Ziel sollte folgendes sein:
Eine Auswertung, welcher user welchen Kunden wie oft besucht hat.

Max
kunden_name | anzahl_besuche | user_id
Müller      | 2              | 1
Meier       | 1              | 1
XXX         | 1              | 1

Franz
kunden_name | anzahl_besuche | user_id
XXX         | 1              | 2

Ist das möglich in einer MySQL-Anfrage?
Prinzp:
SELECT kunden.name as kunden_name,
       user.id as user_id,
       COUNT(besuche.datum) AS anzahl_besuche
   FROM besuche, user, kunden
   GROUP BY user.id,kunden.id

Ergibt aber nicht das gewünschte Ergebnis.

Hat jemand die Lösung / Ansatz, wie ich dazu komme?

Besten Dank
Fabienne

  1. Mahlzeit Fabienne,

    Ist das möglich in einer MySQL-Anfrage?

    Ja.

    SELECT kunden.name as kunden_name,
           user.id as user_id,
           COUNT(besuche.datum) AS anzahl_besuche
       FROM besuche, user, kunden
       GROUP BY user.id,kunden.id

    Ergibt aber nicht das gewünschte Ergebnis.

    Natürlich nicht. Ich vermisse z.B. die Information, über welche Felder die Tabellen gejoint werden. Auch würde ich der besseren Übersichtlichkeit halber eine explizite JOIN-Syntax vorschlagen.

    Hat jemand die Lösung / Ansatz, wie ich dazu komme?

    Erst einmal solltest Du dafür sorgen, dass Du vernünftige Ausgangsdaten bekommst, über die Du dann später gruppierst bzw. zählst (und nicht summierst, wie Dein Titel vermuten ließe!):

    SELECT u.id   AS user_id  
    ,      k.name AS kunden_name  
      FROM besuche b  
      JOIN user    u ON b.user_id = u.id  
      JOIN kunden  k ON b.kunden_id = k.id
    

    MfG,
    EKKi

    --
    sh:( fo:| ch:? rl:( br:> n4:~ ie:% mo:} va:) de:] zu:) fl:{ ss:) ls:& js:|
  2. yo,

    Hat jemand die Lösung / Ansatz, wie ich dazu komme?

    grundsätzlich gibt es eine regel bei gruppierungen, die man immer einhalten sollte. zeige nur die spalten in einer gruppierung an, über die du auch gruppierst hast oder über die du eine aggregat-funktion einsetzt. mysql geht da einen anderen weg, dennoch würde ich dir raten, ihn einzuhalten.

    außerdem hast du die join bedingung der drei tabellen vergessen. das passiert immer dann leicht, wenn man implizite joins verwendet. ich schlage dir vor, IMMER die explizite schreibeweise zu benutzen.

    des weiteren ist mir noch nicht klar, warum du die datumsspalte in den count rein nimmst.

    das alles umgesetzt auf deine abfrage bedeutet:

    SELECT k.id kunden_id
           k.name kunden_name,
           u.id user_id,
           COUNT(*) anzahl_besuche
    FROM besuche b
    INNER JOIN user u ON u.id = b.user_id
    INNER JOIN kunden k ON k.id = b.kunden_id
    GROUP BY u.id, k.id, k.name
    ;

    Ilja

    1. Auch "yo" :-)),

      SELECT k.id kunden_id

      Darf man das AS einfach weglassen? Bei mir funktioniert es zumindest auch!

      OK, mit INNER JOIN habe ich bis dato noch nicht gearbeitet.

      Vielen Dank
      Fabienne

      1. yo,

        Darf man das AS einfach weglassen? Bei mir funktioniert es zumindest auch!

        kommt letztlich immer auf das jeweilige DBMS drauf an, aber imho kannst du es immer weglassen, bei tabellen-alisnamen musst du es sogar bei oracle weglassen. ich empfinde es immer nur als Ballast, das den Code aufbläht.

        OK, mit INNER JOIN habe ich bis dato noch nicht gearbeitet.

        wenn du mit sql arbeiten willst, genauer gesagt mit mit abfragen, die sich auf mehrere tabellen beziehen, dann werden INNER JOIN's ein schwerpunkt für dich sein müssen, ohne dem geht es nicht. und dann gleich die "richtige" schfreibweise, nämlich die explizite und nicht die implizite.

        Ilja