php.de

Zurück   php.de > Webentwicklung > Datenbanken

Datenbanken SQL und Co

Antwort
 
LinkBack Themen-Optionen Thema bewerten
Alt 16.07.2011, 09:41  
Benutzer
 
Registriert seit: 10.06.2011
Beiträge: 34
PHP-Kenntnisse:
Anfänger
Marvin75 befindet sich auf einem aufstrebenden Ast
Marvin75 eine Nachricht über ICQ schicken
Standard [Erledigt] Update Feld in Tabelle

Hallo,

ich würde gerne einen aufaddierten Wert in einer Tabelle per Update aktulaisieren.
Mein MySQL String sieht so aus


Code:
Update tblAnwesenheit
SET Gleitzeitverlauf = (SELECT (SELECT ROUND(SUM(Gleitzeit),2) FROM tblAnwesenheit AS T1 WHERE tblAnwesenheit.ID >= T1.ID) AS Verlauf FROM tblAnwesenheit);
Gleitzeitverlauf ist der aufaddierte Wert des Feldes Gleitzeit. Dieser Update String gibt mir folgenden Fehler aus

Zitat:
Code 109 You can't specify target table 'tblAnwesenheit' for update in FROM clause
Wie kann ich das umschreiben das das funktioniert?

Gruß Marvin
Marvin75 ist offline   Mit Zitat antworten
Sponsor Mitteilung
PHP Code Flüsterer

Registriert seit: 21.08.2005
Beiträge: 4682
PHP-Kenntnisse:
Fortgeschritten

Alt 16.07.2011, 18:01  
Benutzer
 
Registriert seit: 29.05.2011
Beiträge: 58
PHP-Kenntnisse:
Fortgeschritten
seb_ befindet sich auf einem aufstrebenden Ast
Standard

Ich versteh bis Heute nicht, warum MySQL das nicht (wie vor langer Zeit angekündigt) unterstützt. Offiziell heißt es:

Zitat:
Dieser Fehler tritt in Fällen wie dem folgenden auf:

PHP-Code:
UPDATE t1 SET column2 = (SELECT MAX(column1FROM t1); 
Sie können eine Unterabfrage zur Zuweisung innerhalb einer UPDATE-Anweisung verwenden, da Unterabfragen in UPDATE- und DELETE-Anweisungen ebenso zulässig sind wie in SELECT-Anweisungen.
Allerdings können Sie nicht dieselbe Tabelle (in diesem Fall Tabelle t1) sowohl in der FROM-Klausel der Unterabfrage als auch als Aktualisierungsziel angeben.
Also theoretisch NEIN. Praktisch sollte es so aussehen:

PHP-Code:
Update 
        tblAnwesenheit
SET 
        Gleitzeitverlauf 
= (SELECT `GzFROM (SELECT ROUND(SUM(Gleitzeit),2) AS `GzFROM tblAnwesenheit WHERE tblAnwesenheit.ID >= ?) AS `temp`) 
Es muss ein Subquery mit Bezug auf die selbe Tabelle in ein weiteres bezugloses SELECT gepackt werden.
Also warum einfach, wenn es auch kompliziert geht. God bless MySQL !

MfG
__________________
Lesen gefährdet Ihre Dummheit!

Geändert von seb_ (16.07.2011 um 20:00 Uhr).
seb_ ist offline   Mit Zitat antworten
Alt 16.07.2011, 18:19  
Benutzer
 
Registriert seit: 10.06.2011
Beiträge: 34
PHP-Kenntnisse:
Anfänger
Marvin75 befindet sich auf einem aufstrebenden Ast
Marvin75 eine Nachricht über ICQ schicken
Standard

Hallo,

erstmal vielen Dank für die Hilfe.

Es kommt nun folgender Fehler

Zitat:
error : Unknown column 'Gz' in 'where clause'
Code:
UPDATE tblAnwesenheit
SET Gleitzeitverlauf =(
	SELECT
		`Gz`
	FROM
		(
			SELECT
				ROUND(SUM(Gleitzeit), 2)AS `Gz`
			FROM
				tblAnwesenheit
			WHERE
				tblAnwesenheit.ID >= `Gz`
		)AS `temp`
)
Marvin75 ist offline   Mit Zitat antworten
Alt 16.07.2011, 18:23  
Benutzer
 
Registriert seit: 29.05.2011
Beiträge: 58
PHP-Kenntnisse:
Fortgeschritten
seb_ befindet sich auf einem aufstrebenden Ast
Standard

Edit: Quatsch mit Soße, bitte das `Gz` dort entfernen und logischweise deine ID reinpacken.
Habe mich von deiner Abfrage irritieren lassen...

PS: Und wenn du nicht alle Spalten Updaten möchtest, solltest du am Ende noch ein "WHERE ID = ?" einfügen.

MfG
__________________
Lesen gefährdet Ihre Dummheit!

Geändert von seb_ (16.07.2011 um 18:31 Uhr).
seb_ ist offline   Mit Zitat antworten
Alt 16.07.2011, 18:42  
Benutzer
 
Registriert seit: 29.05.2011
Beiträge: 58
PHP-Kenntnisse:
Fortgeschritten
seb_ befindet sich auf einem aufstrebenden Ast
Standard

Und nochmal, um nicht durcheinander zu kommen:
Code:
Update 
        tblAnwesenheit
SET 
        Gleitzeitverlauf = (SELECT `Gz` FROM (SELECT ROUND(SUM(Gleitzeit),2) AS `Gz` FROM tblAnwesenheit WHERE tblAnwesenheit.ID >= ?) AS `temp`)
WHERE
	ID = ?
(? = deine ID)

Jedoch läuchtet mir dann die Abfrage nicht ganz ein. Denn du summierst alle mit ID >= XY und willst dann ein Einzelnes bzw. Alle mit ID XY updaten? Sehe keine Logik darin. Bitte überdenken oder genauere Angaben machen. Ich könnte spekulieren und hätte auch eine Idee, dass wird mir aber zu absurd .

MfG
__________________
Lesen gefährdet Ihre Dummheit!
seb_ ist offline   Mit Zitat antworten
Alt 16.07.2011, 18:54  
Benutzer
 
Registriert seit: 10.06.2011
Beiträge: 34
PHP-Kenntnisse:
Anfänger
Marvin75 befindet sich auf einem aufstrebenden Ast
Marvin75 eine Nachricht über ICQ schicken
Standard

Hallo,

es kommt keine Fehlermeldung mehr, allerdings wird jetzt vom letzten Datensatz der Wert vom Feld Gleitzeit genommen und in alle Felder des Gleitzeitverlaufs kopiert, immer der selbe Wert.

Das Problem liegt wohl in der WHERE Klausel.

PHP-Code:
SELECT
    
(
        
SELECT
            ROUND
(SUM(Gleitzeit), 2)
        
FROM
            tblAnwesenheit 
AS T1
        WHERE
            tblAnwesenheit
.ID >= T1.ID
    
) AS Verlauf

FROM
    tblAnwesenheit

Dieser Select kummuliert mir die Gleitzeit in die Menge Verlauf.

Zitat:
Sinn und Zweck.

Die Errechnung dieser aufaddierten Werte dauer auf meinem MySQL Server (Buffalo Linkstation Mini) ca. 23sek., daher dachte wenn ich das einmalig für alle Datensätze speichere bin ich schneller. Den Verlauf der Gleitzeit brauche ich um ein Diagramm anzuzeigen. Bei eingabe eines Datensatzes wird ja nur der Wert des vorherigen mit dem neuen verrechnet. Ich weiß das man errechnete Wert nicht speichern sollte, aber was soll ich bei dieser Performance machen?
Marvin75 ist offline   Mit Zitat antworten
Alt 16.07.2011, 19:07  
Benutzer
 
Registriert seit: 29.05.2011
Beiträge: 58
PHP-Kenntnisse:
Fortgeschritten
seb_ befindet sich auf einem aufstrebenden Ast
Standard

Also die Abfrage funktioniert schonmal. Nun solltest du dir nochmal genau die komplette Anweisung und vorallem die WHERE-Bedingung ansehen.
Denn ich verstehe die Abfrage auch nicht. Also besser erklären und ggf. mal ein kurzen Aufbau der Tabelle übermitteln.
So wie es ist, ergibt es in meinem Kopf kein Sinn...

MfG

PS: Warum postet du egtl. nochmal die fehlerhafte Variante? Dort stimmt für mich (so oder so) der Bezug von T1 (innerhalb der WHERE Bedingung) einfach garnicht!
__________________
Lesen gefährdet Ihre Dummheit!

Geändert von seb_ (16.07.2011 um 19:11 Uhr).
seb_ ist offline   Mit Zitat antworten
Alt 18.07.2011, 18:48  
Benutzer
 
Registriert seit: 10.06.2011
Beiträge: 34
PHP-Kenntnisse:
Anfänger
Marvin75 befindet sich auf einem aufstrebenden Ast
Marvin75 eine Nachricht über ICQ schicken
Standard

Hallo,

Sorry das ich mich erst jetzt Melde, war das Wochenende indisponiert.



So sieht die Tabelle tblAnwesenheit aus. Das Feld Gleitzeitverlauf ist die aufaddierte Summe des Feldes Gleitzeit. Und genau das möchte ich über eine Update Abfrage berechnen.

Die alte Datenbank war eine Access Datenbank, die neue ist eine MySQL Datenbank. Wie schon in Tread vorher beschreiben ist die Performance des MySQL Server nicht so toll beim berechnen der Felder, deshalb möchte ich diese aufaddierten Werte in der Tabelle speichern. Da es dieses Feld in der alten Datenbank nicht gab, muss ich nun einmalig alle Datensätze mit dem vorherigen Datensatz aufaddieren.

Mit der fehlerhaften "Variante" konnte ich die Datensätze aufaddieren und wiederum in Excel verarbeiten und später in die tblAnwesenheit importieren.
Deshalb hatte ich diese gepostet.

Ich hoffe ich konnte einwenig Licht ins Dunkle bringen.

Geändert von Marvin75 (18.07.2011 um 20:30 Uhr).
Marvin75 ist offline   Mit Zitat antworten
Alt 19.07.2011, 01:32  
Benutzer
 
Registriert seit: 29.05.2011
Beiträge: 58
PHP-Kenntnisse:
Fortgeschritten
seb_ befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
Zitat von Marvin75 Beitrag anzeigen
Ich hoffe ich konnte einwenig Licht ins Dunkle bringen.
Jetzt aber absolut . Ist auch gleich um ein vielfaches einfacher (in beiderlei Hinsicht). Nun nutze eine der beiden Lösungen:

1. Hier werden alle Datensätze wie von dir gewünscht aktualisiert.
PHP-Code:
Update 
        tblAnwesenheit
SET 
        Gleitzeitverlauf 
Gleitzeitverlauf Gleitzeit 
2. Das Gleiche wie oben, nur dass die Gleitzeit auf 0 zurückgesetzt wird, falls du später nochmal ein Update durchführen solltest (ansonsten gäbe es Gratisgleitzeit für Alle).
PHP-Code:
Update 
        tblAnwesenheit
SET 
        Gleitzeitverlauf 
Gleitzeitverlauf Gleitzeit,
        
Gleitzeit        
Anmerkung: Würdest du mit Timestamp's arbeiten, könntest du dir etliche Felder sparen.
Somit hoffe ich ist dir geholfen und wünsche alles Gute!
__________________
Lesen gefährdet Ihre Dummheit!

Geändert von seb_ (19.07.2011 um 01:44 Uhr).
seb_ ist offline   Mit Zitat antworten
Alt 19.07.2011, 17:38  
Benutzer
 
Registriert seit: 10.06.2011
Beiträge: 34
PHP-Kenntnisse:
Anfänger
Marvin75 befindet sich auf einem aufstrebenden Ast
Marvin75 eine Nachricht über ICQ schicken
Standard

Zitat:
Somit hoffe ich ist dir geholfen
Sorry leider nicht ganz.

Bei dem Update werden nur die Felder mit gleicher ID addiert. Das Feld Gleitzeitverlauf ist aber immer die aufaddierte Summe vom Wert Gleitzeit. Also ID2 Gleitzeit mit ID1 Gleitzeitverlauf usw....

Bsp. siehe Bild Tabelle tblAnwesenheit Feld Gleitzeitverlauf
Ich habe das jetzt mit Excel gemacht um das aufzuzeigen wie es aussehen soll.



Aber schon mal vielen Dank für die Arbeit die ich bis jetzt gemacht habe.
Marvin75 ist offline   Mit Zitat antworten
Antwort


Themen-Optionen
Thema bewerten
Thema bewerten:

Forumregeln
Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine 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
Gehe zu

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
Datenbank update mit Checkbox Michelangelo PHP Einsteiger 3 17.02.2011 08:22
[Erledigt] Update über mehrere Zeilen einer Tabelle topoh Datenbanken 16 04.02.2011 18:53
MY-SQL Abfrage nach Daten aus Tabelle 1 die in Tabelle 2 nicht vorhanden sind triple81 Datenbanken 1 25.12.2009 22:46
Bestehende php /Myqsl Tabelle Neben einander aus geben Totti-Totti PHP Tipps 2009 3 21.12.2009 11:00
SQL: Inhalte von zwei Feldern in ein Feld übertragen inichino Datenbanken 4 05.11.2009 14:22
[Erledigt] INSERT und UPDATE gleichzeitig? estebu Datenbanken 8 05.10.2009 00:35
[Erledigt] vista, windows update Fehler 80070422 Screeze Off-Topic Diskussionen 3 23.09.2009 18:24
[Erledigt] Tabelle automatisch generieren scheffie PHP Tipps 2009 18 07.06.2009 16:17
Zeilenanzahl einer tabelle mit WHERE aber ohne schleife? sovereign Datenbanken 13 17.04.2006 20:34
Problem mit Anzeige einer Tabelle mit dem Firefox? HTML, Usability und Barrierefreiheit 8 28.11.2005 15:08
[Erledigt] Problem mit mySQL Datenbanken 7 27.09.2005 12:06
Array nach Feld sortieren PHP Tipps 2005-2 2 07.08.2005 23:00
Feld Update PHP Tipps 2005-2 10 20.07.2005 17:09
[Erledigt] Nimmt andere Tabelle bei update als ich gesagt hab??? Datenbanken 4 23.04.2005 12:16
letztes update von Tabelle auslesen Datenbanken 6 18.09.2004 21:13

Besucher kamen über folgende Suchanfragen bei Google auf diese Seite
datenbank feld update php, mysql ein feld updaten, mysql update felder berechnen, update felder und tabellen mysql, feld in ein anderes feld übertragen mysql, update die vorherrigen daten mit berrechnen mysql, php mysql beim update stimmen werte nicht mehr, datenbank felder über php updaten, php script alle datenbank felder aktualisieren, mysql updatefeld zu bestimmten anderem feld, php datenbank feld update, update feld php, letzte update der tabelle, update select dieselbe tabelle wie, gleitzeit über php, gleitzeit php script, php sql berechnung in feld übertragen, mysql bezug auf tabelle feld, mysql upgrade feldname id, gleitzeit tabellen

Alle Zeitangaben in WEZ +2. Es ist jetzt 12:59 Uhr.




Powered by vBulletin® Version 3.7.2 (Deutsch)
Copyright ©2000 - 2012, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO 3.2.0
Aprilia-Forum, Aquaristik-Forum, Liebeskummer-Forum, Zierfisch-Forum, Geizkragen-Forum