Christopher: UPDATE mit IF verschachteln

Hallo liebe Leser,

vorab schonmal Danke für eure Mühe :)

Ich versuche einen Datensatz abhängig von einem Feld des entsprechenden Datensatzes zu aktualisieren.

Hier ein paar Ansätze die ich probierte:

UPDATE nachrichten
IF(to_user = '1', SET delete_to = 'y', SET delete_from = 'y')
WHERE id = '20'
LIMIT 1;

UPDATE nachrichten
SET IF(to_user = '1', delete_to, delete_from) = 'y'
WHERE id = '20'
LIMIT 1;

UPDATE nachrichten
SET IF(to_user = '1', delete_to = 'y', delete_from = 'y')
WHERE id = '20'
LIMIT 1;

Leider ohne Erfolg. Eigentlich müsste doch ein IF innerhalb des UPDATE funktionieren, oder? Wo liegt mein Denkfehler?

Vielen Dank für Eure Mühe mir auf die Sprünge zu helfen.

Liebe Grüße,
Chris

  1. Hi,

    Ich versuche einen Datensatz abhängig von einem Feld des entsprechenden Datensatzes zu aktualisieren.

    Leider ohne Erfolg. Eigentlich müsste doch ein IF innerhalb des UPDATE funktionieren, oder? Wo liegt mein Denkfehler?

    Ja, das geht - aber du musst dir klar machen, dass IF keinerlei "Zuweisungsfunktionalitaet" hat, sondern lediglich den Wert einer von zwei "Expressions" zurueckgibt.

    Ausserdem scheinst du zwei Spaltenwerte auf einmal setzen zu wollen?

    IF(to_user = '1', SET delete_to = 'y', SET delete_from = 'y')

    Zweiter und dritter Parameter sind kein "Wert", sondern der Versuch, SET an falscher Stelle zu platzieren

    SET IF(to_user = '1', delete_to, delete_from) = 'y'

    SET IF ist auch unsinnig, weil IF wie gesagt lediglich einen Wert zurueckliefert - SET will aber erst mal die Spalte haben, deren Wert es setzen soll.

    SET IF(to_user = '1', delete_to = 'y', delete_from = 'y')

    Dito.

    Funktionieren sollte:
    SET spalte = [Wert, den IF zurueckgibt]

    Also in etwa so:

    SET delete_to   = IF(to_user = '1', 'y', 'n'),  
        delete_from = IF(to_user = '1', 'n', 'y')
    

    Und wenn du nicht jeweils 'n' als Alternativwert fuer ein 'y' haben willst - dann kannst du an dessen Stelle natuerlich auch einfach den Spaltennamen hinschreiben, um den bestehenden Wert zu belassen.

    Btw: Welche Daten bilden die Spalten delete_to und delete_from ab? Aus welchem Grund laesst sich das nicht in einer Spalte unterbringen?

    MfG ChrisB

    1. Hallo ChrisB,

      vielen Dank für deine prompte Hilfe.

      Funktionieren sollte:
      SET spalte = [Wert, den IF zurueckgibt]

      Also in etwa so:

      SET delete_to   = IF(to_user = '1', 'y', 'n'),

      delete_from = IF(to_user = '1', 'n', 'y')

      
      >   
      > Und wenn du nicht jeweils 'n' als Alternativwert fuer ein 'y' haben willst - dann kannst du an dessen Stelle natuerlich auch einfach den Spaltennamen hinschreiben, um den bestehenden Wert zu belassen.  
      >   
      > Btw: Welche Daten bilden die Spalten delete\_to und delete\_from ab? Aus welchem Grund laesst sich das nicht in einer Spalte unterbringen?  
      >   
      > MfG ChrisB  
        
      Es geht um Kurznachrichten. Wenn der Empfänger eine Nachricht löscht, soll bei delete\_to der Wert 1 gesetzt werden. Beim Absender muss delete\_from auf 1 gesetzt werden. Erst wenn beide Benutzer die Nachricht als gelöscht markiert haben wird sie aus dem System geschmissen, sprich endgültig gelöscht. Daher kann ich es nicht in nur einer Spalte abbilden.  
        
      Damit ich die Nachricht nicht vorher auslesen muss, dachte ich mir, ich kann ja anhand von "to\_user" erkennen welcher der beiden das "Löschen" auslöst und dann davon abhängig entweder delete\_to oder delete\_from auf 'y' setzen.  
        
      Ich dachte man könne innerhalb des IF() auch Feldnamen direkt ansprechen. Hatte da wohl einen Denkfehler.  
        
      Vielen Dank für die Hilfe. Werde es gleich probieren :)  
        
      Liebe Grüße,  
      Chris
      
      1. Hi,

        Es geht um Kurznachrichten. Wenn der Empfänger eine Nachricht löscht, soll bei delete_to der Wert 1 gesetzt werden. Beim Absender muss delete_from auf 1 gesetzt werden. Erst wenn beide Benutzer die Nachricht als gelöscht markiert haben wird sie aus dem System geschmissen, sprich endgültig gelöscht.

        Was ist, wenn eine Nachricht an mehrere Benutzer geschickt wird - oder ist das nicht vorgesehen? (Vielleicht wird es dann ja trotzdem zukuenftig von den Nutzern mal als Feature verlangt.)

        Daher kann ich es nicht in nur einer Spalte abbilden.

        Du koenntest doch einfach in einer Spalte einen Zaehler hochsetzen, *wie viele* Nutzer die Nachricht als geloescht markiert haben. Wenn dieser Zaehler Anzahl Empfaenger plus eins (fuer den Absender) erreicht hat - dann kann sie geloescht werden. (Oder gleich umgekehrt, beim Senden der Nachricht Anzahl Empfaenger + 1 abspeichern, und dann beim Loeschen runterzaehlen - bei Null kann das Ding dann in die Tonne.)

        MfG ChrisB

        1. Hi,

          Es geht um Kurznachrichten. Wenn der Empfänger eine Nachricht löscht, soll bei delete_to der Wert 1 gesetzt werden. Beim Absender muss delete_from auf 1 gesetzt werden. Erst wenn beide Benutzer die Nachricht als gelöscht markiert haben wird sie aus dem System geschmissen, sprich endgültig gelöscht.

          Was ist, wenn eine Nachricht an mehrere Benutzer geschickt wird - oder ist das nicht vorgesehen? (Vielleicht wird es dann ja trotzdem zukuenftig von den Nutzern mal als Feature verlangt.)

          Wird die Nachricht an mehrere Empfänger versendet, ist sie auch mehrmals hinterlegt und kann dann auch entsprechend der o.g. Variante (die übrigens Funktioniert! Merci!) jeweils "gelöscht" werden.

          Du koenntest doch einfach in einer Spalte einen Zaehler hochsetzen, *wie viele* Nutzer die Nachricht als geloescht markiert haben. Wenn dieser Zaehler Anzahl Empfaenger plus eins (fuer den Absender) erreicht hat - dann kann sie geloescht werden. (Oder gleich umgekehrt, beim Senden der Nachricht Anzahl Empfaenger + 1 abspeichern, und dann beim Loeschen runterzaehlen - bei Null kann das Ding dann in die Tonne.)

          Ein guter Denkanstoß. Ich mach mir darüber mal Gedanken. Nur muss ich mir dann irgendwie auch noch merken wer gelöscht hat, damit sie dort nicht mehr in der Liste angezeigt werden. Wäre wieder eine Spalte.. würde aber Datensätze sparen. -grübel- Womit u.U. auch der o.g. Weg die Nachrichten mehrfach zu hinterlegen abgeschafft wäre. Ich klingt praktisch.

          Liebe Grüße,
          Chris

          MfG ChrisB