lachesis: /SQL Problem mit bedingtem UPDATE

Hallo zusammen,

seit ner Weile bastele ich an einem UPDATE Statement herum, dass mir einfach nicht gelingen will. So langsam steh ich da wie der Ochs vorm Berg. Kann mir jemand von euch helfen?

UPDATE za_stunden SET gebucht='1'
FROM za_stunden LEFT JOIN za_user ON za_user_id=za_user.id
WHERE za_fnummer_id='16' AND month(datum)<='5' AND year(datum)='2005' AND za_land_id='1'

#1064 - You have an error in your SQL syntax near 'FROM za_stunden LEFT JOIN za_user ON za_user_id=za_user.id
WHERE za_fnummer_id' at line 2

meine tabellen:

za_stunden
id stunden za_user_id za_fnummer_id datum

za_user
id land_id

Ersetze ich UPDATE za_stunden SET gebucht='1' durch SELECT * funktioniert das Statement.

Was mache ich falsch?

Danke für eure Hilfe

lach

--
mal wieder auf http://www.buchlinks.de/ vorbeigeschaut? Mittlerweile mehr als 1200! Bücher. Gerne veröffentlichen wir auch deine Tutorials/Texte/...
  1. echo $begrüßung;

    UPDATE za_stunden SET gebucht='1'
    FROM za_stunden LEFT JOIN za_user ON za_user_id=za_user.id
    WHERE za_fnummer_id='16' AND month(datum)<='5' AND year(datum)='2005' AND za_land_id='1'

    #1064 - You have an error in your SQL syntax near 'FROM za_stunden LEFT JOIN za_user ON za_user_id=za_user.id

    Was mache ich falsch?

    Du hast vergessen zu erwähnen, welches Datenbanksystem du verwendest. An der Fehlermeldung erkennt man aber, dass es MySQL (welche Version?) sein muss.

    Wenn du die UPDATE Syntax richtig verwendest, solltest du mehr Erfolg haben.

    Tipp: UPDATE kennt keine FROM-Klausel

    echo "$verabschiedung $name";

    1. Hi & danke schonmal,

      nach den Beschreibungen auf der Seite komme ich zu:

      UPDATE za_stunden, za_user
      SET za_stunden.gebucht = '1'
      WHERE za_stunden.za_user_id = za_user.id AND za_stunden.za_fnummer_id='8' AND month(za_stunden.datum)<='5' AND year(za_stunden.datum)='2005' AND za_user.za_land_id='1'

      Blöderweise kriege ich wieder:

      #1064 - You have an error in your SQL syntax near ' za_user set za_stunden.gebucht = '1' where za_stunden.za_user_id = za_user.id A' at line 1

      Meine MYSQL Version ist 3.23.39 (leider kann ich nicht updaten)

      Scheinbar bin ich zu doof das zu verstehen.

      Grüßle lach

      --
      mal wieder auf http://www.buchlinks.de/ vorbeigeschaut? Mittlerweile mehr als 1200! Bücher. Gerne veröffentlichen wir auch deine Tutorials/Texte/...
      1. echo $begrüßung;

        Meine MYSQL Version ist 3.23.39 (leider kann ich nicht updaten)

        Ja, na dann: "Starting with MySQL 4.0.4, you can also perform UPDATE operations that cover multiple tables."

        Da wird dir nichts anderes übrig bleiben, als in deinem Script/Programm die zu ändernden Datensätze zuerst zu ermitteln, um damit dann einen UPDATE-Befehl ohne verknüpfte Tabelle zu erstellen und hinterherzuschicken.

        echo "$verabschiedung $name";

        1. Hi,

          *seufz* sowas hab ich mir jetzt fast gedacht. Dann bastel ich mir das halt von Hand.

          War denn das Statement richtig?

          Danke für Deine Hilfe.

          Gruß

          --
          mal wieder auf http://www.buchlinks.de/ vorbeigeschaut? Mittlerweile mehr als 1200! Bücher. Gerne veröffentlichen wir auch deine Tutorials/Texte/...
          1. echo $begrüßung;

            War denn das Statement richtig?

            Syntaktisch sah das jetzt richtig aus. Ob die Bedingungslogik (nach dem ersten AND) dem entspricht was du beabsichtigst, habe ich nicht näher betrachtet.

            Generell kannst du Zahlenwerte, die du selbst vorgibst[1], auch ohne die Anführungszeichen schreiben. Wenn du sie mit hinschreibst ist das erstmal ein String, der durch Typumwandlung in eine Zahl gewandelt werden muss. Performancemäßig sollte das zwar keine nennenswerten Einbußen mit sich bringen, sie sind halt nur überflüssig.

            echo "$verabschiedung $name";

            [1] Zahlen-Daten aus nicht vertrauenswürdigen Quellen solltest du lieber geeignet testen, bevor du sie in einen SQL-Befehl verwendest, da sie zwar als ordentlich maskierter String keine großen Schaden anrichten können sollten, aber zu einer Typ-Mischmasch-Fehlermeldung kann es schon kommen.