2009-03-20 2 views
21

Ho una colonna nella mia tabella intitolata "autorizzato". Il suo valore di default è 0. Ha bisogno di essere cambiato a 1 quando l'utente è autorizzato, ma deve essere in grado di essere resettato a 0. So che potrei farlo facilmente con 2 domande in questo modo:C'è un modo in MySQL per invertire un campo booleano con una query?

$authorised = Db::query('SELECT authorised FROM users WHERE id=2'); 

$newAuthValue = ($authorised['authorised']) ? 0 : 1; 

Db::query('UPDATE users SET authorised=' . $newAuthValue . ' WHERE id=2'); 

Cosa Volevo sapere, c'è un modo per farlo con una query? Per invertire un valore booleano?

risposta

27
UPDATE users SET `authorised` = IF (`authorised`, 0, 1) 
+0

Questo sembra più pulito IMO. :) – alex

+0

Assicurati di aggiungere la tua clausola where, alex. –

+0

@Peter, grazie, e sì, l'ho fatto. – alex

4

Ci sono diversi modi per farlo, qui è semplice:

UPDATE users SET authorised = ABS(authorised - 1) WHERE id = 2; 
+0

Whoops, mancato quello. Grazie Chad. – alex

+4

perché non solo "1 - autorizzato"? – nickf

+1

@nickf: Sono d'accordo con te, il seguente dovrebbe funzionare: UPDATE utenti SET autorizzato = 1 - autorizzato WHERE id = 2; – dalle

30
UPDATE `users` SET `authorised` = NOT `authorised` WHERE id = 2 

Questa query funziona anche a negare il campo, ed è più in linea con la sintassi booleana.

+0

Ok, questo non è stato pubblicato correttamente, quelle barre dovrebbero essere i backtick, che sono l'incapsulatore predefinito di MySQL. –

+0

Questo è buono ...! +1 – alex

+1

SET autorizzato =! Autorizzato –

4

E 'anche possibile utilizzare XOR se il campo 'booleano' è implementato come un TINYINT:

UPDATE users SET authorised = authorised XOR 1 WHERE id = 2; 

Questo imposterà 'autorizzato' a 0 se attualmente 1, e 1 se attualmente 0. Sarà azzera anche tutti i valori diversi da zero, quindi è una soluzione ideale se tu (come me) usi diversi valori positivi per riflettere una varietà di livelli "on", ma devi sempre tornare a 0 quando "off".