Satz ändern, wenn anderer Satz fehlt
Kalle_B
- datenbank
Hallöle,
es geht um MySQL 5
Beim Löschen von Sätzen in Tabelle anw1 hat das PHP- Programm "vergessen", ein zugehöriges Feld in Tabelle evb1 auf 0 (Null) zu setzen.
Programm ist korrigiert, aber 32 falsche Sätze müssen per SQL noch geändert werden. Wie formuliere ich das?
Die 32 Sätze sehe ich mit
SELECT
anw1.id
,anw1.adr_id
,anw1.slot_nr
,anw1.event_id
,evb1.adress_id
,evb1.gebuchte_event_id
FROM XXX as anw1
LEFT JOIN YYY as evb1
ON evb1.adress_id=anw1.adr_id AND evb1.gebuchte_event_id=anw1.event_id
WHERE anw1.owner_id=4 AND anw1.event_id>0 AND evb1.adress_id is NULL
ORDER BY anw1.adr_id
und das Feld anw1.event_id muss auf 0 (Ziffer Null) geändert werden.
Lieben Gruß, Kalle
hi,
Programm ist korrigiert, aber 32 falsche Sätze müssen per SQL noch geändert werden. Wie formuliere ich das?
UPDATE mit SUBSELECT?
Die 32 Sätze sehe ich mit
Oder, im Zweifelsfalle - pder Script, oder sogar manuell.
gruß,
wahsaga
hi,
UPDATE mit SUBSELECT?
Danke, das könnte es sein. Nun habe ich eine Viertelstunde nach der Syntax gesucht, das Suchwort "subselect" bei mysql.com oder google führte nicht zum Ziel.
Auch meine tolles Buch PHP5 & MySQL 5 kennt dieses Stichwort nicht.
Folgendes klappt nicht (ich glaube, das war die Oracle- Syntax):
SELECT
anw1.id
,anw1.adr_id
,anw1.slot_nr
,anw1.event_id
where anw1.id IN (
SELECT
anw1.id
FROM tm_anwesenheit as anw1
LEFT JOIN tm_eventbuchungen as evb1
ON evb1.adress_id=anw1.adr_id AND evb1.gebuchte_event_id=anw1.event_id
WHERE anw1.owner_id=4 AND anw1.event_id>0 AND evb1.adress_id is NULL
ORDER BY anw1.adr_id
)
Fehler:
#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'where anw1 . id IN ( SELECT anw1 . id FROM tm_anwesenheit as anw1 LEFT JOIN ' at line 1
Gerne hätte ich the manual gecheckt ...
Wenn ich IN durch = ersetze, wird es erwartungsgenäß nicht besser.
Kalle
echo $begrüßung;
#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'where anw1 . id IN ( SELECT anw1 . id FROM tm_anwesenheit as anw1 LEFT JOIN ' at line 1
Gerne hätte ich the manual gecheckt ...
Wenn ich IN durch = ersetze, wird es erwartungsgenäß nicht besser.
Der Fehler liegt bei Syntax-Fehlern _immer_ _vor_ der zitierten Stelle.
echo "$verabschiedung $name";
Der Fehler liegt bei Syntax-Fehlern _immer_ _vor_ der zitierten Stelle.
Danke, der Tipp hat geholfen.
Und inzwischen habe ich auch was gefunden. Das Zauberwort heißt allerding "subquery" statt subselect:
http://dev.mysql.com/doc/refman/5.0/en/subqueries.html
Kalle
UPDATE XXX as anw2
SET anw2.event_id=0
WHERE anw2.id IN (
SELECT
anw1.id
FROM XXX as anw1
LEFT JOIN YYY as evb1
ON evb1.adress_id=anw1.adr_id AND evb1.gebuchte_event_id=anw1.event_id
WHERE anw1.owner_id=4 AND anw1.event_id>0 AND evb1.adress_id is NULL
)
#1093 - You can't specify target table 'anw2' for update in FROM clause
SELECT hat vorher wunderbar funktioniert, aber Ändern ist wohl nicht. Muss ich es wohl doch Satz für Satz von Hand machen.
Kalle
und einfach
UPDATE XXX
SET event_id = 0
WHERE id IN (...)
ohne AS anw 2 undd sonstiges?
XXX ist nebenbei bemerkt ein doofer Tabellenname. Du solltest stattdessen vielleicht "Event" bzw. einen bedeutungsschwangereren Namen wählen.
So long, Frank
und einfach
UPDATE XXX
SET event_id = 0
WHERE id IN (...)ohne AS anw 2 undd sonstiges?
Habe ich versucht. Das Problem ist wohl, dass die zu ändernde Tabelle nicht im subquerey vorkommen darf:
#1093 - You can't specify target table 'tm_anwesenheit' for update in FROM clause
XXX ist nebenbei bemerkt ein doofer Tabellenname. Du solltest stattdessen vielleicht "Event" bzw. einen bedeutungsschwangereren Namen wählen.
Ja, war nur der Versuch einer Anonymisierung.
Kalle
Hallöle,
habe jetzt den SELECT mit dem subquery anzeigen lassen und dann die id's einzeln von der Anzeige nach SQL kopiert:
UPDATE tm_anwesenheit
SET event_id=0
WHERE id IN ( 85838, 85837, 85836, 85835, 85833, 85826, 85824, 85822, 85819, 85818, 94528, 94534, 94535, 94536, 94537, 94541, 94548, 94550, 94551, ... )
So ist MySQL zufrieden. Ich glaube, das nächste Projekt mache ich von Anfang an auf Karteikarten.
Kalle
echo $begrüßung;
#1093 - You can't specify target table 'anw2' for update in FROM clause
SELECT hat vorher wunderbar funktioniert, aber Ändern ist wohl nicht. Muss ich es wohl doch Satz für Satz von Hand machen.
Steht im Handbuch beschrieben. Du kannst in einer Tabelle nichts ändern, wenn du gleichzeitig in ihr in einer Subquery Daten selektierst.
echo "$verabschiedung $name";