我在MySql中有一个表,我保存了一些数据,我们假设name
和stand
。
我知道看台将从1到100,我想选择那些未被占用的看台。例如,让我们假设只有5个看台和这个表:
| name | stand |
--------------------
| test | 1 |
| anot | 3 |
| blah | 4 |
| uuuh | 5 |
在这种情况下,唯一的免费展位将是2
。
是否有声明要这样做? ......我正在考虑NOT IN
这个句子,但我无法弄清楚代码......也许我可以在MySql中定义am Array吗?
答案 0 :(得分:2)
如果你知道值是1到100,那么你可以这样做:
select n.num
from (select d1.d*10 + d2.d as n
from (select 0 as d union all select 1 union all select 2 union all select 3 union all select 4 union all
select 5 union all select 6 union all select 7 union all select 8 union all select 9
) d1 cross join
(select 0 as d union all select 1 union all select 2 union all select 3 union all select 4 union all
select 5 union all select 6 union all select 7 union all select 8 union all select 9
) d2
) nums left outer join
stands s
on s.stand = nums.n cross join
(select min(stand) as minstand and max(stand) as maxstand from stands) const
where s.stand is null and nums.n between minstand and maxstand;
这未经过测试,因此可能存在语法错误。
即,创建一个包含所有可能值(1到100)的表。左边加入你的桌子。这将为您提供未使用的所有数字。但是,您希望将其限制为最小值和最大值,因此请计算这些值并将其用于过滤器。
答案 1 :(得分:1)
您可以使用整数表来获取一系列数字。
说: -
SELECT a.i + b.i * 10 + c.i * 100 FROM integers a, integers b, integers c
使用一个名为整数的表,其中一列名为i,其中10行的值为0到9,它将为您提供0到999之间的所有数字(您可以轻松地连接几次以获得更大的数字)号码)。
你可以加入针对你的表来查找未使用的数字: -
SELECT *
FROM (SELECT a.i + b.i * 10 + c.i * 100 AS anInt FROM integers a, integers b, integers c) Sub1
LEFT OUTER JOIN someTable
ON Sub1.anInt = someTable.stand
WHERE someTable.stand IS NULL
这样可以使用,但也可以为你提供立场范围内的所有数字。对于这些你需要加入最小和最大
SELECT Sub1.anInt
FROM (SELECT a.i + b.i * 10 + c.i * 100 AS anInt FROM integers a, integers b, integers c) Sub1
INNER JOIN (SELECT MIN(stand) AS MinStand, MAX(stand) AS MaxStand FROM someTable) Sub2
ON Sub1.anInt >= Sub2.MinStand AND Sub1.anInt <= Sub2.MaxStand
LEFT OUTER JOIN someTable
ON Sub1.anInt = someTable.stand
WHERE someTable.stand IS NULL
答案 2 :(得分:1)
在我看来,一个更简单的解决方案是拥有一个介于1和100之间的所有数字的表。然后从该表左边连接到stand表并显示任何不匹配的值。
您可以创建一个名为“integer_values”的表,其中包含一个名为“value”的字段。然后使用1到100之间的所有数字填充它。然后您可以使用以下查询:
SELECT i.value
FROM integer_values AS i
LEFT JOIN stands AS s
ON i.value = s.stand
WHERE s.stand IS NULL