php-resource



Zurück   PHP-Scripte PHP-Tutorials PHP-Jobs und vieles mehr > Entwicklung > SQL / Datenbanken
 

Login

 
eingeloggt bleiben
star Jetzt registrieren   star Passwort vergessen
 

 

 


SQL / Datenbanken Probleme mit SQL? Hier könnt ihr eure Fragen zu SQL (MySQL, PostgreSQL, MS-SQL und andere ANSI-SQL Server) los werden.

Antwort
 
LinkBack Themen-Optionen Bewertung: Bewertung: 1 Stimmen, 5,00 durchschnittlich.
  #1 (permalink)  
Alt 01-04-2012, 23:09
OldTrainee
 Registrierter Benutzer
Links : Onlinestatus : OldTrainee ist offline
Registriert seit: Apr 2012
Beiträge: 10
OldTrainee befindet sich auf einem aufstrebenden Ast
Standard 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:
Zitat:
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:

Zitat:
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:
UPDATE tabellenname SET `rating_average`=`rating_value`/`rating_hits` 
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
Mit Zitat antworten
  #2 (permalink)  
Alt 01-04-2012, 23:33
hostbar_danny
 Registrierter Benutzer
Links : Onlinestatus : hostbar_danny ist offline
Registriert seit: Feb 2011
Beiträge: 66
hostbar_danny befindet sich auf einem aufstrebenden Ast
Standard

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
Mit Zitat antworten
  #3 (permalink)  
Alt 02-04-2012, 12:01
OldTrainee
 Registrierter Benutzer
Links : Onlinestatus : OldTrainee ist offline
Registriert seit: Apr 2012
Beiträge: 10
OldTrainee befindet sich auf einem aufstrebenden Ast
Standard

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...
Mit Zitat antworten
  #4 (permalink)  
Alt 02-04-2012, 15:54
hostbar_danny
 Registrierter Benutzer
Links : Onlinestatus : hostbar_danny ist offline
Registriert seit: Feb 2011
Beiträge: 66
hostbar_danny befindet sich auf einem aufstrebenden Ast
Standard

Wie sehen denn deine Versuche im Moment aus ? Wo hakt es , gibt es eine Fehlermeldung ?
Mit Zitat antworten
  #5 (permalink)  
Alt 02-04-2012, 17:10
OldTrainee
 Registrierter Benutzer
Links : Onlinestatus : OldTrainee ist offline
Registriert seit: Apr 2012
Beiträge: 10
OldTrainee befindet sich auf einem aufstrebenden Ast
Standard

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....
Mit Zitat antworten
  #6 (permalink)  
Alt 02-04-2012, 20:53
Kropff
  Administrator
Links : Onlinestatus : Kropff ist offline
Registriert seit: Mar 2002
Ort: Köln
Beiträge: 11.721
Kropff befindet sich auf einem aufstrebenden Ast
Standard

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?
__________________
Nukular, das Wort ist N-u-k-u-l-a-r (Homer Simpson)
Meine Seite

Geändert von Kropff (02-04-2012 um 20:56 Uhr)
Mit Zitat antworten
  #7 (permalink)  
Alt 02-04-2012, 22:49
hostbar_danny
 Registrierter Benutzer
Links : Onlinestatus : hostbar_danny ist offline
Registriert seit: Feb 2011
Beiträge: 66
hostbar_danny befindet sich auf einem aufstrebenden Ast
Standard

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
Mit Zitat antworten
  #8 (permalink)  
Alt 02-04-2012, 23:51
OldTrainee
 Registrierter Benutzer
Links : Onlinestatus : OldTrainee ist offline
Registriert seit: Apr 2012
Beiträge: 10
OldTrainee befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
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.
Mit Zitat antworten
  #9 (permalink)  
Alt 04-04-2012, 21:29
hostbar_danny
 Registrierter Benutzer
Links : Onlinestatus : hostbar_danny ist offline
Registriert seit: Feb 2011
Beiträge: 66
hostbar_danny befindet sich auf einem aufstrebenden Ast
Standard

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
Mit Zitat antworten
Antwort

Lesezeichen


Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
 

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
Werte v. Spalte 1, wenn Zeilen in Spalte 2 best. Kriterien erfüllen plastikbaum SQL / Datenbanken 4 11-06-2008 13:17
Teilstrings in Spalte aktualisieren antman SQL / Datenbanken 16 02-12-2004 13:03
automatisch aktualisieren... pirat PHP Developer Forum 4 03-02-2003 12:58
Automatisch Aktualisieren ? Christian Seitz PHP Developer Forum 8 08-08-2001 10:43
automatisch aktualisieren zulli PHP Developer Forum 2 17-04-2001 13:35

Themen-Optionen
Thema bewerten
Thema bewerten:

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are an


PHP News

ebiz-trader 7.5.0 mit PHP7 Unterstützung veröffentlicht
ebiz-trader 7.5.0 mit PHP7 Unterstützung veröffentlichtDie bekannte Marktplatzsoftware ebiz-trader ist in der Version 7.5.0 veröffentlicht worden.

28.05.2018 | Berni

Wissensbestand in Unternehmen
Wissensbestand in UnternehmenLebenslanges Lernen und Weiterbilden sichert Wissensbestand in Unternehmen

25.05.2018 | Berni


 

Aktuelle PHP Scripte

PHP Server Monitor

PHP Server Monitor ist ein Skript, das prüft, ob Ihre Websites und Server betriebsbereit sind.

11.09.2018 Berni | Kategorie: PHP/ Security
PHP WEB STATISTIK ansehen PHP WEB STATISTIK

Die PHP Web Statistik bietet Ihnen ein einfach zu konfigurierendes Script zur Aufzeichnung und grafischen und textuellen Auswertung der Besuchern Ihrer Webseite. Folgende zeitlichen Module sind verfügbar: Jahr, Monat, Tag, Wochentag, Stunde Folgende son

28.08.2018 phpwebstat | Kategorie: PHP/ Counter
Affilinator - Affilinet XML Produktlisten Skript

Die Affilinator Affilinet XML Edition ist ein vollautomatisches Skript zum einlesen und darstellen der Affili.net (Partnerprogramm Netzwerk) Produktlisten und Produktdaten. Im Grunde gibt der Webmaster seine Affilinet PartnerID ein und hat dann unmittelb

27.08.2018 freefrank@ | Kategorie: PHP/ Partnerprogramme
 Alle PHP Scripte anzeigen

Alle Zeitangaben in WEZ +2. Es ist jetzt 17:19 Uhr.