stefnet: MYSQL: durchschnitt (AVG) beschränken

Hallo,
ich habe eine etwas kompliziertere mysql-abfrage und komm jetzt einfach nicht weiter.

ich habe zwei tabellen (Namen, Werte), die ich in dem angehängten bild dargestellt hab.

es soll in der ausgabe die durchschnittsnote errechnet werden und zwar nur für den jeweiligen namen.

ich bin jetzt soweit gekommen, dass er eine durchschnittsnote errechnet, doch leider nur von allen namen.
wie beschränke ich die durchschnittsberechnung auf die jeweilige "namen_id"?

mein bisheriger code:
--------------------------------------------
 SELECT
  Namen.ID,
  Namen.name,
  AVG(Werte.note) AS 'durchs_note'
 FROM
  Namen,
  Werte
 GROUP
  by Namen.ID
 ;
---------------------------------------------

hoffe ihr habt verstanden, worum es mir geht.
gruß
stefan

  1. Hi,

    wie beschränke ich die durchschnittsberechnung auf die jeweilige "namen_id"?

    mittels der WHERE-Clause.

    Cheatah

    --
    X-Self-Code: sh:( fo:} ch:~ rl:° br:> n4:& ie:% mo:) va:) de:] zu:) fl:{ ss:) ls:~ js:|
    X-Self-Code-Url: http://emmanuel.dammerer.at/selfcode.html
    X-Will-Answer-Email: No
    X-Please-Search-Archive-First: Absolutely Yes
  2. Hallo Stefan,

    ich habe eine etwas kompliziertere mysql-abfrage und komm jetzt einfach nicht weiter.

    Deine MySQL-Abfrage ist nicht kompliziert, sie ist leider syntaktisch falsch.

    ich habe zwei tabellen (Namen, Werte), die ich in dem angehängten bild dargestellt hab.

    Leider gibts die Bilder nicht mehr. Könntest Du die Spalten Deiner Tabellen einfach posten?

    ich bin jetzt soweit gekommen, dass er eine durchschnittsnote errechnet, doch leider nur von allen namen.
    wie beschränke ich die durchschnittsberechnung auf die jeweilige "namen_id"?

      
    
    >  SELECT  
    >   Namen.ID,     -- danach ist gruppiert, gut  
    >   Namen.name,   -- nach dieser Spalte musst Du auch gruppieren  
    >   AVG(Werte.note) AS 'durchs_note'  
    >  FROM  
    >   Namen,        -- hier erstellst Du ein wunderbares kartesisches  
    >   Werte         -- Produkt beider Tabellen.  
      
        -- Verknüpfe die beiden Tabellen mit einem Join  
      
    
    >  GROUP BY  
    >   Namen.ID,  
    
         Namen.name    -- fehlt :-)  
    
    

    Ich vermute Du suchst den (INNER) JOIN Deiner beiden Tabellen. Dazu empfehle ich Dir:

    Einführung Joins
    Fortgeschrittene Joins

    Bitte gib Deine MySQL-Version an. Was MySQL kann und was nicht, das ist in hohem Grad von der Versionsnummer abhängig.

    Freundliche Grüße

    Vinzenz

    1. Hallo Stefan,

      [...]

      Leider gibts die Bilder nicht mehr. Könntest Du die Spalten Deiner Tabellen einfach posten?

      Namen
      ID (unique), name, ...

      Werte
      ID (unique), namen_id, note

      ich bin jetzt soweit gekommen, dass er eine durchschnittsnote errechnet, doch leider nur von allen namen.
      wie beschränke ich die durchschnittsberechnung auf die jeweilige "namen_id"?

      SELECT
        Namen.ID,     -- danach ist gruppiert, gut
        Namen.name,   -- nach dieser Spalte musst Du auch gruppieren
        AVG(Werte.note) AS 'durchs_note'
      FROM
        Namen,        -- hier erstellst Du ein wunderbares kartesisches
        Werte         -- Produkt beider Tabellen.

      -- Verknüpfe die beiden Tabellen mit einem Join

      GROUP BY
        Namen.ID,
           Namen.name    -- fehlt :-)

      
      >   
      > Ich vermute Du suchst den (INNER) JOIN Deiner beiden Tabellen. Dazu empfehle ich Dir:  
      >   
      > [Einführung Joins](http://aktuell.de.selfhtml.org/artikel/review/datenbanken/joins/)  
      > [Fortgeschrittene Joins](http://aktuell.de.selfhtml.org/artikel/review/datenbanken/fortgeschrittene-joins/)  
      
      werd ich mir mal durchlesen.  
        
      
      >   
      > Bitte gib Deine MySQL-Version an. Was MySQL kann und was nicht, das ist in hohem Grad von der Versionsnummer abhängig.  
        
      Version 4.1  
        
      
      >   
      >   
      > Freundliche Grüße  
      >   
      > Vinzenz
      
      1. Hallo Stefan,

        Leider gibts die Bilder nicht mehr. Könntest Du die Spalten Deiner Tabellen einfach posten?

        Namen
        ID (unique), name, ...

        Werte
        ID (unique), namen_id, note

        SELECT
          Namen.ID,     -- danach ist gruppiert, gut
          Namen.name,   -- nach dieser Spalte musst Du auch gruppieren
          AVG(Werte.note) AS 'durchs_note'
        FROM
          Namen         -- beachte: Komma entfernt

        INNER JOIN     -- ich gehe davon aus, dass die Spalte
                                 -- namen_id in Tabelle "Werte" mit der
                                 -- Spalte ID der Tabelle "Namen" verknüpft sind

        Werte

        ON Namen.ID = Wert.namen_id

        GROUP BY
          Namen.ID,
             Namen.name    -- fehlt :-)

        -- Wie Ilja sagte, kannst Du dies in MySQL weglassen,
                                 -- aber gewöhne Dir solche Schlampigkeit gar nicht
                                 -- erst an.

          
        sollte liefern, was Du suchst und in  
          
        
        > [Einführung Joins](http://aktuell.de.selfhtml.org/artikel/review/datenbanken/joins/)  
          
        steht die weitere Erläuterung.  
          
        
        > [Fortgeschrittene Joins](http://aktuell.de.selfhtml.org/artikel/review/datenbanken/fortgeschrittene-joins/)  
        > werd ich mir mal durchlesen.  
          
        Das ist eine gute Idee.  
          
        
        > Version 4.1  
          
        Das hier kann sogar die 3.23.x :-)  
          
          
        Freundliche Grüße  
          
        Vinzenz
        
        1. Leider gibts die Bilder nicht mehr. Könntest Du die Spalten Deiner Tabellen einfach posten?

          Namen
          ID (unique), name, ...

          Werte
          ID (unique), namen_id, note

          Also ich hab jetzt diesen Code:

            
           SELECT  
            Namen.ID,  
            Namen.name,  
            AVG(Werte.note) AS 'durchs_note'  
           FROM  
            Namen  
           INNER JOIN  
            Werte  
           ON  
            Namen.ID = Wert.namen_id  
           GROUP BY  
            Namen.ID,  
            Namen.name  
           ;  
          
          

          Soweit so gut, die Durchschnittswerte werden richtig ausgegeben.
          doch fehlen jetzt die "namen", zu denen keine "note" exitstiert. Das sollte nicht so sein. :-|

          sollte liefern, was Du suchst und in

          Einführung Joins

          steht die weitere Erläuterung.

          Fortgeschrittene Joins
          werd ich mir mal durchlesen.

          Das ist eine gute Idee.

          Version 4.1

          Das hier kann sogar die 3.23.x :-)

          Gruß
          Stefan

          1. Hallo Stefan,

            Soweit so gut, die Durchschnittswerte werden richtig ausgegeben.
            doch fehlen jetzt die "namen", zu denen keine "note" exitstiert. Das sollte nicht so sein. :-|

            Ersetze den INNER JOIN durch einen LEFT JOIN, siehe Einführung Joins.

            Freundliche Grüße

            Vinzenz

            1. Hallo Stefan,

              Soweit so gut, die Durchschnittswerte werden richtig ausgegeben.
              doch fehlen jetzt die "namen", zu denen keine "note" exitstiert. Das sollte nicht so sein. :-|

              Ersetze den INNER JOIN durch einen LEFT JOIN, siehe Einführung Joins.

              dank an alle die mir geholfen haben, hat geklappt.

    2. yo,

      Deine MySQL-Abfrage ist nicht kompliziert, sie ist leider syntaktisch falsch.

      nein, er benutzt mysql und dort ist diese abfrage syntaktisch richtig, da die gleiche ID nicht noch unterschiedliche namen haben wird. bei allen anderen dbms wäre dies ein fehler, nicht aber bei mysql...

      Ilja

  3. yo,

    ich bin jetzt soweit gekommen, dass er eine durchschnittsnote errechnet, doch leider nur von allen namen.
    wie beschränke ich die durchschnittsberechnung auf die jeweilige "namen_id"?

    dein ansatz mit group by ist vollkommen richtig und bei mysql musst du auch nicht zusätzlich nach dem namen gruppieren. was aber fehlt ist die JOIN bedingung. deswegen wird das karthesische produkt beider tabelle gebildet. nimm die join bedingung in die WHERE klausel mit rein und dann stimmt die abfrage.

    Ilja