5

私はMySqlにいくつかのデータを保存するテーブルを持っていnameますstand。スタンドが 1 から 100 まであることはわかっています。使用されていないスタンドを選択したいと思います。たとえば、スタンドが 5 つしかなく、次のテーブルがあるとします。

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

この場合、唯一のフリー スタンドは になります2

それを行う声明はありますか?...節で考えていたNOT INのですが、コードがわかりません...多分、MySqlでamArrayを定義できれば?

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

i と呼ばれる単一の列を持つ integers と呼ばれるテーブルを使用すると、値が 0 から 9 の 10 行で、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 までのすべての数値を含むテーブルを作成することです。次に、そのテーブルからスタンド テーブルへの左結合を実行し、一致しない値を表示します。

「value」というフィールドを持つ「integer_values」というテーブルを作成できます。次に、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 に答える