2017-09-07 2 views
-1

私は脳の障害があり、私のクエリのための適切な解決策を見つけることができません。いくつかのアイデアがあるかもしれませんか?私は、次のwhere句で次の空きなしを見つけたいsqlクエリは次の空きIDを取得

マイ海流SQLコードは次のとおりです。

SELECT min(`no` + 1) AS nextNo 
FROM `table1` 
WHERE `no` + 1 not in (
    SELECT `no` 
    FROM `table1` 
    WHERE `sno` = 20 
) 

これは私のテーブル値です:

id=1, no=1, sno=20 

sno=20場合、 nextNo=2の私の結果とそれは正しいです。

しかし、私は助けをsno=10、私**nextNo**=2のための結果ではなく1

多くの多くの感謝を使用している場合!

+1

より多くのサンプルデータと結果を提供してください。私は次のフリー・ノーが何を意味するのか分かりません。 –

+2

あなたの問題では、 'select min'は' select max'でなければなりません。 –

+0

このタイプのID生成は競合状態になりがちで、同じIDが2回選択され、同じNextNoが発行される可能性があります。システム生成IDを使用してこれを処理するか、またはあなたが取得するIDが挿入前に他の誰かに発行されないように独自のロック方法を構築する必要があります。 – xQbert

答えて

3

私はあなただけ与えられたsnoの最大より1つ多いために行くことを示唆している:

select coalesce(max(no) + 1, 1) 
from table1 t1 
where sno = 20; 

あなたは本当に(一般的に良いアイデアのように見えるしていません)の穴を埋めるためにしたい場合:

select coalesce(min(t1.no) + 1, 1) 
from table1 t1 
where t1.sno = 20 and 
     not exists (select 1 
        from table1 tt1 
        where tt1.sno = t1.sno and tt1.no = t1.no + 1 
       ); 
+0

2番目のクエリは正しい方法ですが、SQL構文エラーが発生します:#1064 - SQLにエラーがあります構文;あなたのMySQLサーバのバージョンに対応するマニュアルをチェックして、 '1)の近くで使用する正しい構文を参照してください。) – Korty

+1

2番目のクエリのどこにそれが表示されますか?あなたの試みはこれにマッチしていますか? – xQbert

1

あなたのクエリは混乱しています。詳細を教えてください。あなたは表1に使用できない次の番号を検索したい場合は、あなたの条件はすべての値について曖昧かつ真である場合には、ので、あなたは

SELECT max(`no`) + 1 AS nextNo FROM `table1` 

そして、SNO = 10のためのクエリのリターン2を使用することができます。

+0

わかりました。あいまいな状態を解決する考えはありますか? – Korty

+0

クエリの条件が役に立たないようです。 @gordenの最初のクエリを使用することをお勧めします –

関連する問題