2012-01-06 46 views
2

簡單無法做到位或操作上的int字段MySQL查詢

假設一個int類型字段在我的表包含任何二進制四位數字(0和1的組合,如1010,0110等) 。我如何有選擇地更新其中一些數字而不更改其他數字。

詳細
我在permissionsuser_relevance_code場(是int(10)型),其存儲四位數字代表佔該類型特定的權限是相關的。這四位數字分別存儲1或0,表示它是否相關。從左到右,與這些帳戶類型的相關性 - ManagerPublisher,Advertiser,Developer被存儲。因此,存儲在此字段中的值0110意味着它與經理,發佈者相關並與廣告客戶無關。

現在,在任何時候,假設我需要將其中一些權限標記爲與管理人員相關,或者使其與廣告主和發佈者相關,同時使其與管理人員無關,並且所有此類隨機操作。對於所有這些情況,我需要保持其他數字不變。這意味着,如果我只需要更新經理相關性數字,我就不應該觸摸發佈商和廣告客戶數字。

問題
很顯然,我需要做的二進制或我需要的user_relevance_code當前值應用和存儲它的代碼,但是這不是爲我工作。

爲了使某些權限有關出版商的運作,我想這個查詢 -

update permissions set user_relevance_code = (0100 | user_relevance_code) where <condition to update some permissions> 

但這並沒有產生預期的效果。那些早些時候有1000的記錄被更新爲1004,我希望它們變成1100(只更新第二位數字爲1,並保留其他數據原樣)。

我也嘗試將該字段的類型更改爲binary。我想我做錯了。

回答

2

在MySQL中,0100是一個十進制數,而不是基數爲2的數字,這就是爲什麼你得到了100 | 1000的1004。如果你想確保2 位設置,那麼你想這樣的:

user_relevance_code = b'100' | user_relevance_code 

,或者,如果你願意爲了清晰指定所有四位(當位扯皮一個好主意):

user_relevance_code = b'0100' | user_relevance_code 

以上所有內容確實假設您確實將位圖存儲在您的user_relevance_code而不是10位數字(例如1000,1101,110等)中,而這些數字看起來像是二進制文件。如果值真的是小數,那麼位的工作不是做這項工作的最佳工具,你可能會想使用這樣不愉快的事情:

user_relevance_code = (user_relevance_code div 1000) * 1000 + 100 + (user_relevance_code % 100) 

迫使10 數字是一個1而另外三個人單獨離開。

我必須說,在SQL中做點事情並不是一件很自然的事情。一個單獨的(用戶,許可)關聯表將會更加自然。然後,您將通過簡單的連接,插入和刪除操作權限集。當然,如果你無法控制架構,那麼你必須去配合你所擁有的東西。

+0

非常感謝您的解釋,但'ox_permissions中select(b'0100'| user_relevance_code)其中user_relevance_code = 1000'也表示'1004'並且'更新ox_permissions set user_relevance_code =(b'1000'| user_relevance_code)其中user_relevance_code = 1000'不做更新。不知道我是否缺少一些東西。 – 2012-01-06 10:17:03

+0

@Sandeepan:'where user_relevance_code = 1000'使用十進制值。你的桌子是什麼樣的?數據真的是什麼樣子? 'user_relevance_code'實際上是一個位圖嗎? – 2012-01-06 19:07:57