Werte in Spalte 3 automatisch aktualisieren...

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Werte in Spalte 3 automatisch aktualisieren...

    Hallo liebe Mitglieder,

    ich bin neu hier und über die suche meines Problem bei euch aufgeschlagen.
    Ich habe das ganze Wochenende damit verbracht, meine MySQL Datenbank ein wenig kennen zu lernen.

    Viele neue Fremdwörter in bezug auf MySQL habe ich in der Zeit nun kennen gelernt, aber wie ich mein Problem löse, habe ich nicht heraus gefunden.

    Es geht um folgendes Problem.
    Ich habe ein Bewertungssystem, welches bei Abgabe einer Bewertung diese in der Datenbank abspeichert.

    Hierfür werden zwei Spalten verwendet wie ich schon heraus gefunden habe:
    rating_hits = Abgegenene Stimmen
    rating_value = Bewertungspunkte Gesamt
    Nun wollte ich aber auch den durchschnittlichen Wert in die Datenbank haben und habe dafür eine weitere Spalte hinzugefügt:

    rating_average = Diese Spalte soll die durschnittliche Bewertung eines Artikels anzeigen
    Ich habe nun gesucht, wie ich es schaffe den Werte "rating_hits" durch "rating_value" zu dividieren und gleichzeitig in die Spalte "rating_average" zu schreiben.

    Dafür habe ich folgenden Befehl gefunden den ich gleich ausprobiert habe und es hat auch prima geklappt:

    Code:
    [COLOR=#000000][COLOR=#0000BB]UPDATE tabellenname SET [/COLOR][COLOR=#007700]`[/COLOR][COLOR=#0000BB]rating_average[/COLOR][COLOR=#007700]`=[/COLOR][COLOR=#DD0000]`rating_value`/`rating_hits` [/COLOR][/COLOR]
    Jetzt wird mir nun der durschnittliche Wert in Spalte "rating_average" angezeigt.

    Das Problem:
    Wenn nun ein Artikel nochmals bewertet wird und die Spalten "rating_hits" und "rating_value" werden dadurch geändert, tut sich in der Spalte "rating_average" überhaupt nichts.

    Nun war meine Überlegung, ich suche nach einen Befehl, der mir den in meiner MySQL neu startet wenn sich in einer der beiden Spalten etwas verändert.

    Jedoch habe ich bis Heute nichts gefunden und hoffe jemand kennt sich mir diesen MySQL Problem aus.

    Lg
    OT

  • #2
    Hallo,

    warum lässt du das UPDATE Statement nicht noch einmal ausführen sobald sich etwas an den Bewertungen ändert (du also so wie so rating_hits und rating_value änderst)?

    Alternativ könntest du den Durchschnitt auch beim Auslesen der Datenbank berechnen: SELECT rating_value/rating_hits AS rating_average FROM ...

    Möchtest du dein beschriebenes Verhalten Datenbankseitig realisieren, also sobald sich der Wert von rating_hits und rating_value ändert, soll auch rating_average neu berechnet werden, dann ist TRIGGER der richtige Suchbegriff für dich ( MySQL :: MySQL 5.5 Reference Manual :: 18.3 Using Triggers )

    Gruß Danny
    hostbar - Full Service Internet Agentur

    Kommentar


    • #3
      Danke für deine Antwort....
      Mit diesen Tigger habe ich mich am Sontag befasst, aber vielleich bin ich ja zu Blöd dafür.

      Vermutlich habe ich das Grundprinzip des Tiggers nicht verstanden. Google hat auch nichts richtiges ausgespruckt aber vielleicht habe ich nur nach den falschen Keys gesucht.

      Der Tigger soll ja, wenn sich in Spalte Hits od. Spalte Value etwas ändert, den Rechenvorgang Hits/Value durchführen und in Spalte Average schreiben.

      Nur bring ich es nicht zusammen den Code so anzupassen...

      Kommentar


      • #4
        Wie sehen denn deine Versuche im Moment aus ? Wo hakt es , gibt es eine Fehlermeldung ?
        hostbar - Full Service Internet Agentur

        Kommentar


        • #5
          Ich habe es so probiert:

          Code:
          CREATE TRIGGER TabellennameTriggername AFTER UPDATE ON Tabellenname  FOR EACH ROW SET `rating_average` =`rating_value`/`rating_hits`;
          Aber anscheinend mag er irgendwas am Code nicht....

          Kommentar


          • #6
            Liegt wahrscheinlich am fehlenden Delimiter. Probier mal das aus (ungetestet):
            Code:
            DELIMITER $$
            CREATE TRIGGER 
              TabellennameTriggername AFTER UPDATE ON Tabellenname  
              FOR EACH ROW BEGIN
                UPDATE Tabellenname SET rating_average = rating_value/rating_hits;
              END$$
            DELIMITER ;
            Peter

            PS: Fehlt da nicht eine eindeutige ID?
            Zuletzt geändert von Kropff; 02.04.2012, 20:56.
            Nukular, das Wort ist N-u-k-u-l-a-r (Homer Simpson)
            Meine Seite

            Kommentar


            • #7
              Hi,

              der Code sieht bis auf Kleinigkeiten nicht verkehrt aus. Aber du musst (oder kannst, dass weiß ich nicht genau?) bei Trigger die Spalten mit NEW bzw. OLD ansprechen. In einem Update Statement enthält z.B. OLD.rating_hits den Wert vor der Änderung und NEW.rating_hits den Wert nach der Änderung.

              Daraus resultiert folgender Trigger:

              Code:
              CREATE TRIGGER 
                  testtrigger 
              BEFORE UPDATE ON test  
              FOR EACH ROW 
                  SET NEW.rating_average = NEW.rating_value/NEW.rating_hits
              Warum BEFORE UPDATE und nicht AFTER UPDATE ?

              Im AFTER Trigger kannst du nicht mehr auf NEW Felder zugreifen, da zu dem Zeitpunkt der Updatevorgang schon abgeschlossen ist. OLD Felder können aber nur gelesen und nicht beschrieben werden. Deshalb hier der BEFORE UPDATE Trigger, bei dem in NEW.rating_value und NEW.rating_hits jeweils der neue Wert steht.

              @ Peter
              Der DELIMITER ist meines Wissens nur bei Stored Procedures notwendig bzw. bei mehrzeiligen Anweisungen (wie in deinem Fall mit BEGIN .... END ). In dem Fall kann man das aber getrost in eine Zeile ohne BEGIN und END packen.


              Gruß Danny
              hostbar - Full Service Internet Agentur

              Kommentar


              • #8
                Zitat von hostbar_danny Beitrag anzeigen

                Daraus resultiert folgender Trigger:

                Code:
                CREATE TRIGGER 
                    testtrigger 
                BEFORE UPDATE ON test  
                FOR EACH ROW 
                    SET NEW.rating_average = NEW.rating_value/NEW.rating_hits
                Warum BEFORE UPDATE und nicht AFTER UPDATE ?

                Im AFTER Trigger kannst du nicht mehr auf NEW Felder zugreifen, da zu dem Zeitpunkt der Updatevorgang schon abgeschlossen ist. OLD Felder können aber nur gelesen und nicht beschrieben werden. Deshalb hier der BEFORE UPDATE Trigger, bei dem in NEW.rating_value und NEW.rating_hits jeweils der neue Wert steht.
                Hab ich das richtig verstanden dass das NEW nichts über die Spalte aussagt sonder die das angesprochen wird was nach dem "." kommt.

                rating_avarage & rating_hits bleiben immer gleich, ausser ein user macht ein Update und gibt eine Bewertung ab. Logischerweise erhöht sich dieser wert dann dementsprechend. Diese beiden veränderten Werte sollen dann eben berechnet werden und das NEUE Ergebnis mit dem ALTEN Ergebnis in Spalte rating_average überschrieben werden.

                Kommentar


                • #9
                  Hi,

                  ich hab deinen Post nicht ganz verstanden.

                  machen wir ein kleines Beispiel:

                  Du hast folgenden Stand:
                  rating_hits = 4
                  rating_value = 14
                  rating_average = 3,5

                  Sprich es haben 4 Benutzer abgestimmt, mit einer Durchschnittsbewertung von 3,5

                  Nun gibt ein User eine Bewertung von 1 ab

                  UPDATE ... SET rating_hits = 5, rating_value = 15 WHERE ... ;

                  Nun greift automatisch dein Trigger und OLD und NEW ist dafür da, um auf den Wert eines Feldes vor bzw. nach der Änderung zugreifen zu können. Im Fall von oben wäre:

                  OLD.rating_hits = 4
                  OLD.rating_value = 14
                  OLD.rating_average = 3,5

                  NEW.rating_hits = 5
                  NEW.rating_value = 15
                  NEWrating_average = 3

                  Beim Ausführen des BEFORE TRIGGERS ist der Datensatz noch nicht geändert, deswegen kannst du NEW Felder noch manipulieren.

                  Gruß Danny
                  hostbar - Full Service Internet Agentur

                  Kommentar

                  Lädt...
                  X