【问题标题】:Check 2 numbers algorithm检查2个数字算法
【发布时间】:2014-04-23 09:17:31
【问题描述】:

我在 db 上有 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 或 ruby​​。我需要检查当前情况,获得更大的专业并添加次要+1,如果不是65536,否则次要为0,主要得到专业+1。

提前致谢。

编辑: 我必须将主要和次要保存到各自的领域。他们为每个注册的用户增加。

例如。 用户

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

现在 Tom 的主要增量是因为表上的最后一个次要是 65536。

65538, tom, 0 , 1

我不知道如何解释更多。

【问题讨论】:

  • 您想生成一个包含这两个字段的文件,还是想以某种方式处理现有文件?从您的问题中不清楚您的目标是什么。
  • 我是否正确理解您在问两个问题:1. 给定这些(主要,次要)对的列表,找到最大值,以及 2. 给定最大(主要,次要)对,下一个?
  • 这似乎是一个完全可预测的集合,那么为什么要存储它呢? RDBMS 在这里似乎无关紧要(此外,如果是我,我会先列出主要列)
  • 当我编辑问题时,当新用户注册时,最后一个次要 +1。有点自动增量,但限制为 65536,当达到 65536 时重置为 0 并增加主要 + 1
  • 在做了一些研究后,我发现 UNSIGNED SMALLINT = 65535。我会检查它是否有效。

标签: php mysql node.js algorithm bookshelf.js


【解决方案1】:

我绝对肯定理解这个问题,但这里有一些关于限制整数值范围的想法:

  • 与许多语言一样,MySQL 有一些 UNSIGNED SMALLINT 数据类型,它们保存 2 字节值,即从 0 到 65535(不是 65536!)
  • 大多数编程语言都有一个“模数”运算符 (% -- php mysql),它允许您收集剩余的整数除法。例如,... % 65536 将返回一个介于 0 和 65535 之间的值,包括。如果您确实需要一个介于 0 和 65536 之间的值(包括),您将改为使用 ... % 65537
  • 您可以使用 mask 运算符(“按位与”& -- php mysql)。例如,... & 0xFFFF 将仅保留数字的两个最低有效字节 - 实际上执行相当于“模 65536”操作(结果介于 0 和 65535 之间)

【讨论】:

  • 您对 2 字节值是正确的,让我检查一下如何使用它。这是我的逻辑。获得更大的专业,比如说 2,获得更大的未成年人,其中专业是 2,增加未成年人 + 1。
  • 在我做了一些测试之后,我的最后一条评论有效,我使用了 UNSIGNED SMALLINT 并进行了 2 次查询,因为我无法在代码中进行选择。
【解决方案2】:
$magicNumber = 65536;
$sql = "
SELECT
  MAX(userIndex) userIndex
FROM (
 SELECT 
   (Minor + (Major * ".$magicNumber.")) AS userIndex
 FROM TableName
) AS innerSelect
";

运行 sql 会为您提供当前最高的 userIndex,假设它是 145323。 现在把它加一,你就有了$newIndex = 145324

这将为您提供当前最高的索引。现在可以像这样计算字段:

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

【讨论】:

  • Michael 我忽略了您的回答,只是因为我无法使用我正在使用的 orm 进行选择,或者不知道如何选择。还是谢谢。
猜你喜欢
  • 2021-07-30
  • 2011-12-28
  • 2011-09-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多