2014-04-23 33 views
0

我有2個字段的數據庫。小和大:檢查2個數字的算法

Minor, Major 
0,0 
1,0 
2,0 
3,0 
4,0 
5,0 
7,0 
8,0 
... 
65536,0 
0,1 
1,1 
2,1 
3,1 
4,1 
... 
65536,1 
0,2 

什麼是最好的方式來比較這一點。我在Bookshelf.js上這樣做,但在PHP或紅寶石也歡迎。我需要檢查當前情況,獲得更大的專業和添加次要+ 1,如果不是65536否則次要是0大專獲得專業+ 1.

在此先感謝。

編輯: 我必須保存主要和次要到各自的領域。他們爲註冊的每個用戶增加。

例如。 用戶

id, username,minor,major 
1, john , 0, 0 
2, mike, 1, 0 
.... 
65537, jeff, 65536,0 

現在湯姆的,主要的增量becuse個次要表爲65536

65538, tom, 0 , 1 

我不知道該怎麼解釋了。

+0

是否要生成包含這兩個字段的文件,或者是否希望以某種方式處理現有文件?你的問題並不清楚你的目標是什麼。 –

+0

我是否正確理解你提出了兩個問題:1.給出這些(主要,次要)對的列表,找到最大值,並且2.給定最大(主要,次要)對,得到下一個? –

+0

這似乎是一個完全可預測的集合,爲什麼要存儲它呢? RDBMS在這裏似乎並不相關(除此之外,如果是我,我會首先列出主要列) – Strawberry

回答

1

我絕對不一定要了解這個問題,但這裏有一些想法,有關限制的整數值的範圍:

  • 就像許多的語言,MySQL有一些UNSIGNED SMALLINT保存2數據類型-bytes值,即從0到65535(! 65536)
  • 大多數編程laguage有一個「模」運算符(% - phpmysql),允許你收集的整數分頻的其餘部分。例如,... % 65536將返回一個介於0和65535之間的值。如果您確實需要介於0和65536之間的值,則會改爲編寫... % 65537
  • 您可以使用掩碼運算符(「按位」和「&-phpmysql」)。例如,... & 0xFFFF將僅保持一個數字的兩個最低顯著字節 - (。具有0和65535之間含一個結果)實際執行一個「模數65536」的操作的等效
+0

你對2字節值是正確的,讓我檢查一下如何使用它。這是我的邏輯。獲得更大的專業,讓說2,更大的未成年人,其中主要是2,增加未成年人+1。 – flakerimi

+0

我做了一些測試後,我的最後一條評論工作,我用UNSIGNED SMALLINT並做了2個查詢,因爲我不能做select in select碼。 – flakerimi

0
$magicNumber = 65536; 
$sql = " 
SELECT 
    MAX(userIndex) userIndex 
FROM (
SELECT 
    (Minor + (Major * ".$magicNumber.")) AS userIndex 
FROM TableName 
) AS innerSelect 
"; 

運行sql爲您提供了當前最高的userIndex,假設它是145323. 現在將此值加1,並且您有$newIndex = 145324

這給你目前最高的指數。現在可以這樣計算字段:

$major = (int)($newIndex/$magicNumber); 
$minor = $newIndex % $magicNumber; 
+0

邁克爾我忽略了你的答案,因爲我不能選擇與orm我選擇使用,或不知道如何。不管怎麼說,還是要謝謝你。 – flakerimi