Kalle_B: Satz ändern, wenn anderer Satz fehlt

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

  1. 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

    --
    /voodoo.css:
    #GeorgeWBush { position:absolute; bottom:-6ft; }
    1. 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

      1. 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";

        1. 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

  2. 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

    1. 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

      1. 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

        1. 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

    2. 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";