php.de

Zurück   php.de > Webentwicklung > Datenbanken

Datenbanken SQL und Co

Antwort
 
LinkBack Themen-Optionen Thema bewerten
Alt 26.09.2007, 13:41  
Moderator
 
Benutzerbild von cycap
 
Registriert seit: 13.02.2008
Beiträge: 6.816
PHP-Kenntnisse:
Fortgeschritten
cycap ist einfach richtig nettcycap ist einfach richtig nettcycap ist einfach richtig nettcycap ist einfach richtig nettcycap ist einfach richtig nett
Standard UPDATE mit Subquery

Hey Leute,

ich habe festgestellt das bei mir einige Daten nicht passen und wollte nun ein Update machen um die in der Userverwaltung bestätigten User auch in der Newsletterdatenbank auf bestätigt zu setzen. Leider habe ich mit das wohl zu einfach vorgestellt denn

Code:
UPDATE `phplist_user_user` SET `confirmed` =1 WHERE `id` IN (
(
  SELECT newsletter.phplist_user_user.id
  FROM newsletter.phplist_user_user
  INNER JOIN user.userdata ON newsletter.phplist_user_user.id = user.userdata.pl_uid
  WHERE newsletter.phplist_user_user.confirmed =0
  AND user.userdata.bestaetigt =1
)
)
ergibt folgenden MySQL-Fehler:

Code:
#1093 - You can't specify target table 'phplist_user_user' for update in FROM clause
Ich will jetzt nicht wissen was der Fehler heisst (Englisch kann ich auch) sondern hoffe das jemand eine Idee hat wie ich es anders machen könnte.

Gruß
CyCap
cycap ist offline   Mit Zitat antworten
Sponsor Mitteilung
PHP Code Flüsterer

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

Alt 26.09.2007, 14:00  
Erfahrener Benutzer
 
Registriert seit: 21.05.2008
Beiträge: 9.937
Zergling-new wird schon bald berühmt werden
Standard

In dem du die Fehlermeldung liest und eine Alternative anwendest:
Offenbar ist es nicht erlaubt, die im Mainquery verwendete Tabelle auch im Subquery zu verwenden. Ich denke das hast du auch verstanden, aber warum benutzt du überhaupt die Tabelle im Subquery?

Reicht nicht ein Subquery von
Code:
UPDATE phplist_user_user SET confirmed = 1 WHERE id IN (SELECT user.userdata.id FROM user.userdata.bestaetigt = 1)
Zumindest wären dann beide Tabellen synchronisiert.
3 grundsätzliche Verbesserungsvorschläge noch:
1. Wenn du schon Backticks verwendest, dann überall!
2. phplist_user_user.id - ziemlich sinnfreier Name. Ich persönlich würde die Namen sinnvoll kürzen
3. Deine Datenbank ist nicht normalisiert und das führt dazu, dass sich nur du mit der Datenbank auskennst. Wenn du mal krank bist oder die Firma wechselst heißt das für die Kollegen, dass man zu raten anfangen muss, welche Daten jetzt die aktuelleren sind. Das ist nicht gut und nicht nötig!
Zergling-new ist offline   Mit Zitat antworten
Alt 26.09.2007, 14:36  
Moderator
 
Benutzerbild von cycap
 
Registriert seit: 13.02.2008
Beiträge: 6.816
PHP-Kenntnisse:
Fortgeschritten
cycap ist einfach richtig nettcycap ist einfach richtig nettcycap ist einfach richtig nettcycap ist einfach richtig nettcycap ist einfach richtig nett
Standard

Zitat:
Zitat von Zergling
In dem du die Fehlermeldung liest und eine Alternative anwendest:
Offenbar ist es nicht erlaubt, die im Mainquery verwendete Tabelle auch im Subquery zu verwenden. Ich denke das hast du auch verstanden, aber warum benutzt du überhaupt die Tabelle im Subquery?

Reicht nicht ein Subquery von
Code:
UPDATE phplist_user_user SET confirmed = 1 WHERE id IN (SELECT user.userdata.id FROM user.userdata.bestaetigt = 1)
Zumindest wären dann beide Tabellen synchronisiert.
3 grundsätzliche Verbesserungsvorschläge noch:
1. Wenn du schon Backticks verwendest, dann überall!
2. phplist_user_user.id - ziemlich sinnfreier Name. Ich persönlich würde die Namen sinnvoll kürzen
3. Deine Datenbank ist nicht normalisiert und das führt dazu, dass sich nur du mit der Datenbank auskennst. Wenn du mal krank bist oder die Firma wechselst heißt das für die Kollegen, dass man zu raten anfangen muss, welche Daten jetzt die aktuelleren sind. Das ist nicht gut und nicht nötig!
Vielen Dank für deine ausführliche Antwort. Das mit dem Subquery hab ich ursprünglich gemacht um rauszusuchen ob der betreffende User überhaupt im Newsletter stehen soll, weil sonst steht in der pl_uid eine 0 aber mit deiner Abfrage kann ich das ja auch einfach mit pl_uid > 0 lösen.

Die Backticks kamen vom PMA, da ich dort die Abfrage eingetippt habe, da es ja eine einmalige Sache sein sollte.

Die Tabelle phplist_user_user ist erstellt vom Newslettersystem PHPList. Die haben sowieso total die wirren Tabellennamen das ich manchmal ne Minute suchen muss bis ich die richtige Tabelle gefunden habe.

Nochmal danke auf dich kann man sich verlassen
cycap ist offline   Mit Zitat antworten
Alt 26.09.2007, 21:01  
Erfahrener Benutzer
 
Registriert seit: 21.05.2008
Beiträge: 9.937
Zergling-new wird schon bald berühmt werden
Standard

Kein Problem! Aber funktionierts denn überhaupt?
Zergling-new ist offline   Mit Zitat antworten
Alt 27.09.2007, 13:04  
Erfahrener Benutzer
 
Benutzerbild von lazydog
 
Registriert seit: 02.04.2008
Beiträge: 4.034
lazydog befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
Zitat von Zergling
Offenbar ist es nicht erlaubt, die im Mainquery verwendete Tabelle auch im Subquery zu verwenden.
Das gilt allerdings nur für Änderungsabfragen. In SELECTs kann die gleiche Tabelle beliebig oft in Unterabfragen vorkommen.
__________________
Gruss
L
lazydog ist offline   Mit Zitat antworten
Alt 27.09.2007, 14:12  
Moderator
 
Benutzerbild von cycap
 
Registriert seit: 13.02.2008
Beiträge: 6.816
PHP-Kenntnisse:
Fortgeschritten
cycap ist einfach richtig nettcycap ist einfach richtig nettcycap ist einfach richtig nettcycap ist einfach richtig nettcycap ist einfach richtig nett
Standard

Zitat:
Zitat von Zergling
Kein Problem! Aber funktionierts denn überhaupt?
Das Prinzip schon, nur hattest du die falschen Felder drin, aber das soll ja nicht das Problem sein

Zitat:
Zitat:
Zitat von Zergling
Offenbar ist es nicht erlaubt, die im Mainquery verwendete Tabelle auch im Subquery zu verwenden.
Das gilt allerdings nur für Änderungsabfragen. In SELECTs kann die gleiche Tabelle beliebig oft in Unterabfragen vorkommen.
Da frag ich mich doch: Warum ist das so? Was haben die sich dabei gedacht? Endlos-schleifen vermeiden?
cycap ist offline   Mit Zitat antworten
Alt 27.09.2007, 14:25  
Erfahrener Benutzer
 
Registriert seit: 21.05.2008
Beiträge: 9.937
Zergling-new wird schon bald berühmt werden
Standard

Naja eine Selbstreferenz beim UPDATE kann wirklich problematisch sein, da das UPDATE ja unmittelbar durchgeführt wird und von seinem eigenen Zustand abhängig ist, den es aber fortlaufend verändert.
Zergling-new 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
Update / syntaxfehler prinzli Datenbanken 7 24.11.2007 21:24
INSERT.. ON DUPLICATE KEY UPDATE cycap Datenbanken 3 26.10.2007 13:08
Update über zwei Tabellen tekknotrip Datenbanken 2 26.02.2007 16:25
Rückgabewert von UPDATE Tommek Datenbanken 3 08.06.2006 15:39
zwei SQL-Befehle (SELECT UND UPDATE) auf einmal vollziehen. Datenbanken 3 09.03.2006 16:34
Update des aufrufenden Fensters dh1sbg HTML, Usability und Barrierefreiheit 2 10.02.2006 00:10
UPDATE count nach Link Aufruf ? PHP Tipps 2006 9 22.01.2006 14:53
[Erledigt] mysql: INSERT und wenn vorhanden UPDATE Datenbanken 7 07.01.2006 09:54
[Erledigt] per Update eine zahl ehöhen lassen Datenbanken 3 04.07.2005 16:37
Update in mysql funzt nicht maeck PHP Tipps 2005-2 4 27.06.2005 22:52
Update per Cronjob (where Feld = Wort) Apfeltyp PHP Tipps 2004-2 3 14.12.2004 18:25
UPDATE mit ' im Text Datenbanken 2 09.11.2004 20:07
[Erledigt] UPDATE = NO Update aber kein fehler..dringend hilfe suchend Datenbanken 2 25.09.2004 16:28
php update PHP Tipps 2004 2 24.09.2004 01:07
update PHP Tipps 2004 12 08.06.2004 23:08

Besucher kamen über folgende Suchanfragen bei Google auf diese Seite
mysql update select subquery, mysql update subquery, update subquery, update subquery mysql, mysql subquery update, mysql update with subquery, synchronisiertes subselect, http://www.php.de/datenbanken/44826-update-mit-subquery.html, subquery update, mysql update mit subquery, synchronisierte subselects, update mit subselect, update subselect, mysql update subselect, sql update subselect, you can\'t specify target table for update in from clause, subquery update mysql, update mit subquery, mysql update table subquery, synchronisierter subselect

Alle Zeitangaben in WEZ +1. Es ist jetzt 03:50 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

Creative Commons License
Dieser Inhalt ist unter einer Creative Commons-Lizenz lizenziert.