2009-03-20 17 views
21

मेरे पास 'अधिकृत' शीर्षक वाली मेरी तालिका में एक कॉलम है। उसके डिफ़ॉल्ट 0. यह 1 करने के लिए परिवर्तित किया जा सकता है जब उपयोगकर्ता के लिए अधिकृत है की जरूरत है, लेकिन यह मैं जानता हूँ कि मैं 2 प्रश्नों तो जैसे के साथ आसानी से ऐसा कर सकता है 0 पर रीसेट किया जा करने में सक्षम होना चाहिए:क्या MySQL में एक प्रश्न के साथ एक बूलियन फ़ील्ड को रिवर्स करने का कोई तरीका है?

$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'); 

क्या मैं जानना चाहता था, क्या एक प्रश्न के साथ ऐसा करने का कोई तरीका है? एक बुलियन मूल्य को उलट करने के लिए?

उत्तर

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

यह क्लीनर आईएमओ दिखता है। :) – alex

+0

बस सुनिश्चित करें कि आप अपना क्लॉज, एलेक्स जोड़ते हैं। –

+0

@ पीटर, धन्यवाद, और हाँ मैंने किया। – alex

4

ऐसा करने के कई तरीके हैं, यहाँ एक साधारण एक है:

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

अरे, इसे याद किया। धन्यवाद चाड। – alex

+4

क्यों न केवल "1 - अधिकृत"? – nickf

+1

@nickf: मैं आपसे सहमत हूं, निम्नलिखित कार्य करना चाहिए: अद्यतन उपयोगकर्ता SET अधिकृत = 1 - अधिकृत जहां आईडी = 2; – dalle

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

इस क्वेरी भी क्षेत्र नकारना के लिए काम करेंगे, और बूलियन वाक्य रचना के साथ और अधिक इनलाइन है।

+0

ठीक है, जो ठीक से पोस्ट नहीं किया गया था, उन स्लेश बैकटिक्स होना चाहिए, जो MySQLs डिफ़ॉल्ट encapsulator हैं। –

+0

यह एक अच्छा है ...! +1 – alex

+1

एसईटी अधिकृत =! अधिकृत –

4
भी

इसके XOR उपयोग करने के लिए यदि संभव हो तो अपने 'बूलियन' फ़ील्ड को TINYINT के रूप में कार्यान्वित किया जाता है:

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

यह अगर वर्तमान में 1 0 करने के लिए 'अधिकृत' सेट हो जाएगा, और करने के लिए 1 यदि वर्तमान में 0. यह होगा सभी गैर-शून्य मानों को भी शून्य करें, इसलिए यदि आप (जैसे मुझे) विभिन्न प्रकार के 'ऑन' स्तरों को प्रतिबिंबित करने के लिए कई सकारात्मक मानों का उपयोग करते हैं, तो एक आदर्श समाधान है, लेकिन हमेशा 'ऑफ' होने पर 0 पर वापस जाने की आवश्यकता होती है।

संबंधित मुद्दे