5

我在 MySql 中有一个表,我在其中保存了一些数据让我们假设 aname和 a stand。我知道展位会从 1 到 100,我想选择那些没有被占用的展位。例如,假设只有 5 个展台和这张桌子:

|  name  |  stand  |
--------------------
|  test  |    1    |
|  anot  |    3    |
|  blah  |    4    |
|  uuuh  |    5    |

在这种情况下,唯一的自由立场将是2.

有没有声明可以做到这一点?...我正在考虑该子句NOT IN,但我无法弄清楚代码...也许我可以在 MySql 中定义 am Array?

4

3 回答 3

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)的表。把这个加入你的桌子。这为您提供了所有未使用的数字。但是,您希望将其限制为最小值和最大值,因此请计算这些值并将它们用于过滤。

于 2013-04-02T13:07:50.167 回答
1

您可以使用整数表来获取一系列数字。

说:-

SELECT a.i + b.i * 10 + c.i * 100 FROM integers a, integers b, integers c

使用一个名为 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
于 2013-04-02T13:11:10.720 回答
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
于 2013-04-02T13:33:58.577 回答