mediengestalter.info
FAQ :: Mitgliederliste :: MGi Team

Willkommen auf dem Portal für Mediengestalter

Aktuelles Datum und Uhrzeit: Fr 29.03.2024 12:19 Benutzername: Passwort: Auto-Login

Thema: [SQL] LEFT JOIN + UPDATE Problem vom 20.12.2008


Neues Thema eröffnen   Neue Antwort erstellen MGi Foren-Übersicht -> Programmierung -> [SQL] LEFT JOIN + UPDATE Problem
Seite: 1, 2  Weiter
Autor Nachricht
Smooth-Graphics
Threadersteller

Dabei seit: 22.05.2006
Ort: -
Alter: -
Geschlecht: Männlich
Verfasst Sa 20.12.2008 18:43
Titel

[SQL] LEFT JOIN + UPDATE Problem

Antworten mit Zitat Zum Seitenanfang

Hey ihr,



ich bastel grad ne etwas komplexere Updatefunktion, jetzt muss ich zwei Tabellen aktualisieren.

Code:

UPDATE contactdata AS c
LEFT JOIN
(
  SELECT username AS uname
  FROM user
)
AS u
ON u.uid='1'
SET u.uname='admin', c.website='http://xyz.abc-def.hij', c.icq='12345567', c.msn='fkwug@hotmail.de', c.openID='' WHERE u.uid='admin'



Darauf meldet SQL:
Zitat:
#1288 - The target table u of the UPDATE is not updatable



Mag mir jemand kurz helfen, ist bestimmt nur nen dummer Denkfehler, aber ich packs grad nich so ganz *bäh*
  View user's profile Private Nachricht senden Website dieses Benutzers besuchen
mAsuRa

Dabei seit: 14.05.2005
Ort: -
Alter: -
Geschlecht: -
Verfasst So 21.12.2008 07:57
Titel

Antworten mit Zitat Zum Seitenanfang

Dein SQL Statment ist falsch !
  View user's profile Private Nachricht senden
Anzeige
Anzeige
pRiMUS

Dabei seit: 09.09.2003
Ort: Vienna
Alter: 48
Geschlecht: Männlich
Verfasst So 21.12.2008 08:49
Titel

Antworten mit Zitat Zum Seitenanfang

ich hab so ein wirres konstrukt auch noch nie gesehen. n update statement kenn ich nur

Code:
update tabelle set foo = bar


zumindest wenn man nach sql standards arbeitet.
  View user's profile Private Nachricht senden Website dieses Benutzers besuchen
Smooth-Graphics
Threadersteller

Dabei seit: 22.05.2006
Ort: -
Alter: -
Geschlecht: Männlich
Verfasst So 21.12.2008 09:50
Titel

Antworten mit Zitat Zum Seitenanfang

Na schön. Ich brauch aber nun mal eins mit JOIN und das gehört durchaus auch zum SQL Standard. Meine Güte!
Ich hab irgendwie keine Lust das ganze mit 3 SQL Statements hintereinander zu machen, was auch deutlich unperformanter wäre.

@masura: super^^

//also ganz falsch ist es sicher nicht, nur irgendwo hängt der wurm in der JOIN Verknüpfung.

//// mySQL Doku sagt:
Zitat:

Sie können auch UPDATE-Operationen durchführen, die sich auf mehrere Tabellen beziehen. Allerdings können Sie ORDER BY oder LIMIT nicht in einer UPDATE-Anweisung für mehrere Tabellen verwenden. Die Klausel table_references listet die Tabellen auf, die im Join berücksichtigt werden. Die Syntax ist in Abschnitt 13.2.7.1, „JOIN“, beschrieben. Hier ein Beispiel:

UPDATE items,month SET items.price=month.price
WHERE items.id=month.id;
Das obige Beispiel zeigt einen inneren Join, der den Kommaoperator verwendet. UPDATE-Anweisungen für mehrere Tabellen können jedoch einen beliebigen Join-Typ verwenden, der für SELECT-Anweisungen zulässig ist, also etwa LEFT JOIN.

Sie benötigen die Berechtigung UPDATE nur für diejenigen in einer UPDATE-Anweisung für mehrere Tabellen referenzierten Spalten, die tatsächlich geändert werden. Die Berechtigung SELECT hingegen benötigen Sie für alle Spalten, die gelesen, aber nicht modifiziert werden.

Wenn Sie eine UPDATE-Anweisung für mehrere Tabellen verwenden, die auch InnoDB-Tabellen einbezieht, für die Fremdschlüssel-Constraints vorhanden sind, dann verarbeitet der MySQL-Optimierer die Tabellen unter Umständen in einer Reihenfolge, die sich von der ihrer Parent/Child-Beziehung unterscheidet. In diesem Fall schlägt die Anweisung fehl, und es wird ein Rollback durchgeführt. Stattdessen sollten Sie die Änderung dann in nur einer Tabelle durchführen und sich auf die ON UPDATE-Funktionalität verlassen, die InnoDB bietet, um andere Tabellen entsprechend zu ändern. Siehe auch Abschnitt 14.2.6.4, „Fremdschlüssel-Beschränkungen“.

Zurzeit können Sie in einer Unterabfrage keine Aktualisierungsoperation in einer Tabelle durchführen und gleichzeitig eine Auswahl in einer anderen Tabelle treffen.


Aber es hat auch mit dem "normalen" JOIN statt nem LEFT JOIN nicht funktioniert.


Zuletzt bearbeitet von Smooth-Graphics am So 21.12.2008 09:58, insgesamt 2-mal bearbeitet
  View user's profile Private Nachricht senden Website dieses Benutzers besuchen
pRiMUS

Dabei seit: 09.09.2003
Ort: Vienna
Alter: 48
Geschlecht: Männlich
Verfasst So 21.12.2008 11:32
Titel

Antworten mit Zitat Zum Seitenanfang

ich kann mir auch vorstellen das dein subselect dort mehr als nur ein ergebnis zurückliefert und das hier der hund begraben liegen kann.

das joins auch bei updates gehen war mir gänzlich neu.
  View user's profile Private Nachricht senden Website dieses Benutzers besuchen
Smooth-Graphics
Threadersteller

Dabei seit: 22.05.2006
Ort: -
Alter: -
Geschlecht: Männlich
Verfasst So 21.12.2008 11:42
Titel

Antworten mit Zitat Zum Seitenanfang

pRiMUS hat geschrieben:
ich kann mir auch vorstellen das dein subselect dort mehr als nur ein ergebnis zurückliefert und das hier der hund begraben liegen kann.


Leider nein, denn auch mit DISTINCT führt das Statement nicht zu einem korrekten UPDATE. Menno!

Nicht dass das jetzt dringend wäre, im Moment habe ich es einfach doch mit 2 Queries gelöst, aber es würde mich einfach interessieren, wie das nun mit nem Subselect und nem JOIN richtig geht. Man will sich ja auch weiterbilden.

@Primus: Ja, war mir bis dahin auch unbekannt, nichtmal in meiner SQL Referenz steht was darüber drin, aber im Internet findet man spärliche Informationen dazu...

//edit: Also es liegt definitiv am JOIN, ich habs nochmal umgeschrieben in:
Code:

UPDATE contactdata, user
SET user.username='admin', contactdata.website='http://www.-.de/', contactdata.icq='123456', contactdata.msn='@.de', contactdata.openID=''
WHERE user.UID='1'
AND user.password='123456'


Nun ändert er mir zwar die Werte ab, allerdings bei allen usern, nicht nur bei user.UID='1'
Ich glaub da muss ich mich nochmal kurz mit dene JOINS befassen, da war doch was mit HAVING etc.


Zuletzt bearbeitet von Smooth-Graphics am So 21.12.2008 11:52, insgesamt 2-mal bearbeitet
  View user's profile Private Nachricht senden Website dieses Benutzers besuchen
m
Moderator

Dabei seit: 18.11.2004
Ort: -
Alter: -
Geschlecht: Männlich
Verfasst So 21.12.2008 11:56
Titel

Antworten mit Zitat Zum Seitenanfang

Zitat:
das joins auch bei updates gehen war mir gänzlich neu.


Joins in UPDATE/DELETE Statements laufen schon seit Version 4.x irgendwas...
  View user's profile Private Nachricht senden Website dieses Benutzers besuchen
Smooth-Graphics
Threadersteller

Dabei seit: 22.05.2006
Ort: -
Alter: -
Geschlecht: Männlich
Verfasst So 21.12.2008 12:03
Titel

Antworten mit Zitat Zum Seitenanfang

* Ich geb auf... *

Jaja, die JOINS...


So gelöst: simpel und einfach, die WHERE Klausel war falsch... *ha ha*
Code:

UPDATE contactdata, user
SET user.username='admin', contactdata.website='http://www.x-y.de/'
WHERE user.UID=contactdata.UID AND user.UID='1'
  View user's profile Private Nachricht senden Website dieses Benutzers besuchen
 
Ähnliche Themen MySQL: Left JOIN Problem
JOIN LEFT
LEFT JOIN ?
SQL Abfrage mit LEFT JOIN bleibt hängen
[SQL] Problem mit Join Abfrage
Div Float Left Problem
Neues Thema eröffnen   Neue Antwort erstellen Seite: 1, 2  Weiter
MGi Foren-Übersicht -> Programmierung


Du kannst keine Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum nicht antworten.
Du kannst an Umfragen in diesem Forum nicht mitmachen.