Php 仅选择数组中而非表中的数字

Php 仅选择数组中而非表中的数字,php,mysql,select,notin,Php,Mysql,Select,Notin,我在MySql中有一个表,我在其中保存了一些数据,让我们假设一个名称和一个支架。 我知道展台的数量将从1到100,我想选择那些没有被占用的展台。例如,假设whe只有5个支架,该表: | name | stand | -------------------- | test | 1 | | anot | 3 | | blah | 4 | | uuuh | 5 | 在这种情况下,唯一的自由展位将是2 有这样的声明吗。。。我在考虑

我在MySql中有一个表,我在其中保存了一些数据,让我们假设一个名称和一个支架。 我知道展台的数量将从1到100,我想选择那些没有被占用的展台。例如,假设whe只有5个支架,该表:

|  name  |  stand  |
--------------------
|  test  |    1    |
|  anot  |    3    |
|  blah  |    4    |
|  uuuh  |    5    |
在这种情况下,唯一的自由展位将是2


有这样的声明吗。。。我在考虑不在的条款,但我想不出代码。。。也许我可以在MySql中定义am数组?

如果您知道值是从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的表。把这个放到你的桌子上。这将为您提供所有未使用的数字。但是,您希望将其限制为最小值和最大值,因此计算这些值并将其用于过滤器。您可以使用整数表来获得一个数字范围

说:-

对于一个名为integers的表,它有一个名为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

在我看来,一个更简单的解决方案是有一个所有数字都在1到100之间的表。然后从该表向左连接到stands表,并显示任何不匹配的值

您可以创建一个名为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

如果你知道它,并且可以把所有的展台都放到自己的阵列中,你可以做一些类似$freeStands=array\u Diffrange1100,$idArray;哦…在sql之外。。。我没想过,谢谢,这应该是个好主意solution@Akam只有当表中的行具有可用的stands列但为空或未在定义的列表中时,这才有效。虽然,如果数据不在数据库中,那就没什么用了。你可以在mysql中定义一个数组,它叫table。你说得很对,但我对数据库结构没有访问权限,太简单了:顺便说一句,是的,这是正确的方法,在这种特殊情况下,正确的方法是退出mysql,正如Jon在开始时所说,这可能是正确的方法,但我无法访问db结构,因此我无法更改任何表:/
SELECT  i.value

FROM    integer_values AS i

        LEFT JOIN stands AS s
        ON i.value = s.stand

WHERE   s.stand IS NULL