2016-08-01 69 views
0

Hier ist meine Abfrage?Wie kann ich eine konstante Zahl als niedrigste Zahl in einer Spalte festlegen?

UPDATE users 
SET reputation = reputation - (CASE WHEN id = 29 THEN 2 
            WHEN id = 30 AND NOT 0 THEN 15 
            ELSE 0 
           END) 
WHERE id IN (30, 29); 

Manchmal wirft es diesen Fehler:

#1690 - BIGINT UNSIGNED value is out of range in '(spy.users.reputation - (case when (spy.users.id = 29) then 2 when ((spy.users.id = 30) and (not(0))) then 15 else 0 end))'

Wie Sie in der Fehlermeldung angezeigt wird, reputation Spalte ist UNSIGNED, und ich brauche es zu halten 1 mindestens .. etwas genau wie Stackoverflow : Wenn ein Benutzer 1 Wiederholungen hat und er einen Downvote erhält, bleibt seine Wiederholung 1. Nun, wie kann ich diese Update-Abfrage beheben, um in einem solchen Fall einen Fehler zu vermeiden?

+2

Was genau wollen Sie hier tun: 'WHEN id = 30 AND NOT 0 '? – sgeddes

+0

@sgeddes 'WENN id = 29' ist OP und' WENN id = 30' ist Responder. Auch "AND NOT 0" prüft, ob der Responder nicht das OP ist. – stack

+1

Ich denke ich bin mir nicht sicher, wie 'not 0' hier hilft. Auf welches Feld bezieht es sich? Angenommen, die ID, wenn es 30 ist, wie könnte es 0 sein? Vielleicht verstehe ich einfach nicht, es ist die Verwendung ... – sgeddes

Antwort

1

Verwendung greatest():

UPDATE users  
    SET reputation = GREATEST(reputation - 
           (CASE WHEN id = 29 THEN 2 
            WHEN id = 30 AND NOT 0 THEN 15          
            ELSE 0 
           END), 
           1) 
    WHERE id IN (30, 29); 

EDIT:

diese Version Versuchen:

UPDATE users   
SET reputation = (CASE WHEN reputation > (CASE WHEN id = 29 THEN 2 
               WHEN id = 30 THEN 15 
               ELSE 0 
              END) 
         THEN reputation - (CASE WHEN id = 29 THEN 2 
               WHEN id = 30 THEN 15 
               ELSE 0 
              END)         
         ELSE 1        
        END)  
WHERE id IN (30, 29); 

Das Problem ist die Zwischenberechnung. Ich dachte, MySQL könnte die Zwischenberechnungen korrekt durchführen und dann bei der Zuweisung fehlschlagen.

+0

Gut danke .. upvote ... nur warum ', 0)'? Ich erwähnte, dass ich '1 'als niedrigsten Wert haben möchte. – stack

+0

Auch [dieser Fehler ist immer noch da] (http://i.stack.imgur.com/Lfp6o.png) ... ich meine' 'greatest()' doesn mach es nicht anders. – stack

+0

Ihre zweite Version funktioniert auch .. Auch zu Ihrer Information kann ich einfach 'CAST()' -Funktion in diesem Fall anstelle dieser verschachtelten 'case .. wenn' verwenden. Hier ist [die letzte Abfrage] (https://gist.github.com/anonymous/120bfdfde349ace4c0323f9570179a67), die perfekt funktioniert. – stack