2013-04-02 10 views
5

私はMySqlにいくつかのデータを保存するテーブルを持っていて、namestandと仮定します。 私はスタンドが1から100になることを知っている、私は撮影されていないスタンドを選択したいと思います。この場合には配列内にありテーブル内にない数字のみを選択する

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

のみ無料スタンドは2次のようになります。たとえばのはわずか5スタンドと、このテーブルを持っているWHEと仮定しましょう。

これを行う声明はありますか? ...私は節NOT INを考えていましたが、コードを理解できません...もしMySqlでArrayを定義できたらどうですか?

+1

を、そして独自の配列にして、すべての 'stand'年代を得ることができ、あなたが何かを行うことができます'$ freeStands = array_diff(range(1,100)、$ idArray));' – Jon

+0

oh ... sqlの外に...私はそれについて考えなかった、おかげで、それは解決策でなければならない –

+0

' $ taken_stands =配列(1、2、3、5、7); echo $ ids = explode( "、"、$ taken_stands); $ Sql = "... WHERE STANDS NOT IN($ ids)"; ' –

答えて

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)のテーブルを作成します。これをテーブルに残しておきます。これにより、使用されていないすべての番号が得られます。しかし、最小値と最大値に制限したいので、これらを計算してfilterinに使用してください。

1

整数の表を使用して数値の範囲を取得できます。

セイ: - 簡単にすることができます(あなたに0と999の間のすべての番号を取得します9までの値0と10行で、私と呼ばれる単一の列と整数と呼ばれるテーブルで

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

より多くの数字を得るためにテーブルに数回参加してください)。

は、あなたがテーブルに対して、未使用の番号を検索することに参加できます -

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

簡単な解決策に対して参加する必要があり、私の意見では、その後、左がにそのテーブルから参加しない1から100の間のすべての番号を持つテーブルを持っているだろうスタンドテーブルと一致しない値を表示します。

"value"というフィールドを持つ "integer_values"というテーブルを作成できます。そして、その後、あなたは次のクエリを使用でき100までの1からすべての数字を移入:あなたはそれを知っていれば

SELECT i.value 

FROM integer_values AS i 

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

WHERE s.stand IS NULL 
+0

これは正しいアプローチかもしれないが、私はDB構造にアクセスする必要がないので、私はテーブルを変更することはできませんでした: –

関連する問題