我有一个包含如下值的表:
"things"
+ FirstOctet + SecondOctet +
| 0 | 0 |
| 0 | 1 |
| 1 | 0 |
| 1 | 0 |
+------------+-------------+
本质上,FirstOctet
和 SecondOctet
包含 0-255 范围内的值。行没有特别的顺序。我想根据最低的 FirstOctet
和 SecondOctet
查询数据库以获取表中的下一个可用值。 FirstOctet 和 SecondOctet 没有重复值(如果有意义的话)。
所以,如果表格看起来像这样:
"things"
+ FirstOctet + SecondOctet +
| 1 | 0 |
| 1 | 4 |
| 1 | 1 |
| 1 | 3 |
+------------+-------------+
我希望它发现下一个可用值是 FirstOctet=1
和 SecondOctet=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/