mysql - 获取范围内的下一个可用值

标签 mysql sql

我有一个包含如下值的表:

"things"
+ FirstOctet + SecondOctet +
| 0          | 0           |
| 0          | 1           |
| 1          | 0           |
| 1          | 0           |
+------------+-------------+

本质上,FirstOctetSecondOctet 包含 0-255 范围内的值。行没有特别的顺序。我想根据最低的 FirstOctetSecondOctet 查询数据库以获取表中的下一个可用值。 FirstOctet 和 SecondOctet 没有重复值(如果有意义的话)。

所以,如果表格看起来像这样:

"things"
+ FirstOctet + SecondOctet +
| 1          | 0           |
| 1          | 4           |
| 1          | 1           |
| 1          | 3           |
+------------+-------------+

我希望它发现下一个可用值是 FirstOctet=1SecondOctet=2

到目前为止,我所拥有的只是一个非常简单的查询,用于计算第一个八位字节,并且计数低于 255。

select 
    *, count(*) as count
from
    things
group by first_octet
having count < 255
order by first_octet

我不知道从这里去哪里。我在想,一旦我找到 FirstOctet < 255 的行,它必须有可用的行。我从这里去哪里?

最佳答案

工作演示:http://sqlfiddle.com/#!2/1e60c8/3

CREATE VIEW ViewBoolean AS SELECT 0 as b UNION SELECT 1 as b;
CREATE VIEW ViewByteValues AS
SELECT b0.b + b1.b*2 + b2.b*4 + b3.b*8 + b4.b*16 + b5.b*32 + b6.b*64 + b7.b*128 as v       FROM
ViewBoolean b0,ViewBoolean b1,ViewBoolean b2,ViewBoolean b3,ViewBoolean b4,ViewBoolean b5,ViewBoolean b6,ViewBoolean b7;

-- above from covus corax, http://stackoverflow.com/questions/304461/generate-an-integer-sequence-in-mysql

CREATE VIEW ViewOctetPairs AS
SELECT octet1.v as octet1, octet2.v as octet2
  FROM ViewByteValues AS octet1
CROSS JOIN
      ViewByteValues AS octet2
WHERE octet1.v < 256
AND
octet2.v < 256
;

Create Table things 
(Octet1 INT,
 Octet2 INT)
;

那么查询就是

SELECT * FROM ViewOctetPairs as allPairs
LEFT JOIN
   things
ON allPairs.octet1 = things.octet1
AND allPairs.octet2 = things.octet2
WHERE things.octet1 IS NULL
ORDER BY allPairs.octet1 ASC, allPairs.octet2 ASC
LIMIT 1

想法是 - 您创建一个 2 列“ View ”,其中包含每个数字排列。然后将它与“事物”结合起来,仅从 View 中选择在“事物”中的行,然后选择第一个,其中第一个表示最低的可用第一列,如果有不止一列,该列中最低的可用第二列。

关于mysql - 获取范围内的下一个可用值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26557490/

相关文章:

mysql - 如何根据其他 2 列选择 1 列的最大值和最小值?

mysql - 仅当所有记录都匹配时如何从连接中获取结果

mysql - 查询运行时间更长。优化建议

php - SQL 查询返回整个表而不是单行

sql - 将 $not 与 $any Sequelize

php - 计算两个时间戳之间停电的Mysql查询

php - 如何比较两个数据库之间的 mysql 表并有效地更新差异?

mysql - 如何从终端导出mysql表

mysql - JOINS 大型查询中的 SQL 子查询链

java - 是否可以在 Hazelcast 上为 IMap<String, Set<Object>> 进行分布式 SQL 查询?