2017-10-25 1 views
1

私はMySQLでPHPで作成したパーツ管理システムを持っています。私が作成しようとしているのは、私にとって次の部品番号を生成するものです。すべての部品番号は3文字の接頭辞(製品ファミリ/カテゴリによって決まります)から始まり、番号が続きます。例えばPHPでwhileループを使ってデータベースクエリの次の数字を決定

「ABC001」

私は以下の持っていることは、私は私が望むように、次の番号が既に「ABC001」、「ABC002」&「ABC003」を有するれるかを決定するために使用したいものですその製品番号がまだ存在しないため、クエリーが偽になるまでクエリーを実行することによって、次の番号が何であるかを認識することができます。

$abc_query = "SELECT * FROM products WHERE id LIKE 'ABC%'"; 
 
$abc_result = $mysqli2->query($abc_query); 
 
while($row = $abc_result->fetch_assoc()) { 
 
\t \t $rowid = $row["id"]; 
 
\t \t $pnumber = substr($rowid, 3, 3); 
 
\t \t echo $pnumber. '<br/>'; 
 
\t \t $int = (int)$pnumber; 
 
\t \t $abc_query2 = "SELECT * FROM products WHERE id 'ABC" . sprintf('%03s', $int); 
 
\t \t 
 
\t \t for ($abc_query2 = true; $abc_query2 = false; $int++){ 
 
\t \t \t echo $int; 
 
\t \t }$abc_nextnumber = $int +1; 
 
} 
 
$abc_newnumber = 'ABC' . sprintf('%03s', $abc_nextnumber); 
 
echo $abc_newnumber;

私が得る結果は結果がでなければなりません。しかしながら

001 
002 
003 
ABC004 

コード更新私は、コードを更新しました

001 
002 
003 
005 
ABC006 

が、それはseではない私は005を持っている場合、誰もが知っている場合、EMは、私はそれはそれ一度0の異なる量になりますよう、それは(クエリへの自動ゼロを追加することができますどのようにそれは006

+0

mysqlはABCの列を分割していない理由は、その上で '最大の()'選択し、整数に残りをキャスト? – cowbert

+0

それは難しいですか?私はデータベースをまったく変更したくありません。 – Spence

答えて

3

あなたはこのクエリを試してみてもらえますか?

SELECT MAX(SUBSTR(ID、4))SUBSTR(ID、1、3)= 'ABC'

編集製品FROM last_idとして:

products TABLE 
============== 
ABC001 
ABC002 
ABC003 
ABC005 
============== 

我々が望みます製品一覧にが見つかりました。

SELECT SUBSTR(t1.id, 4) + 1 as POSSIBLE_MIN_ID 
FROM products t1 
WHERE NOT EXISTS (
    SELECT * 
    FROM products t2 
    WHERE SUBSTR(id, 1, 3)='ABC' AND SUBSTR(t2.id, 4) = SUBSTR(t1.id, 4) + 1 
) LIMIT 1 

結果: POSSIBLE_MIN_ID:4

+0

私はそれが偽になるまで数えたい理由は、我々が' ABC001 '、' ABC002 ' 、 'ABC003'& 'ABC005'と私はそれが 'ABC004'になる次の利用可能なものを見つけることを望みます。 – Spence

+0

@Spence質問を正しく理解できませんでした。私は自分の答えを更新しました。 – ahmeti

+0

PHPMyadminでクエリを実行すると、実際に私が望む結果が得られます。どのように私はこれをエコーアウトするか、変数に入れますか? – Spence

3

に行きますABC004で停止します'ABC011'になります)を入力するのではなく、非常に役に立ちます。

先頭にゼロを自動的に処理する方法は次のとおりです。

$sql3 = "SELECT * FROM products WHERE id 'ABC" . sprintf('%03s', $int); 
+0

お返事ありがとうございます。私が探している主な答えは、最初の部分です。スプリントの場合 - それは最大でも2であるが、 'ABC010'で終わる場合は1になる - どうすればよいだろうか? – Spence

+0

ゼロは、$ intの値に応じて自動的にカウントが変化します。したがって、$ intが1の場合、上記のコードは001を返します。$ intが10の場合は010を返します。$ intが900の場合、900を返します。基本的には、長さが3桁まで長いです。 – BarryMode

+0

ありがとうございます!私はこれを早く見つけたかったです! – Spence

4

あなたはデシベルではなく、あなたのアプリのこの操作を行う必要があります。

select t.id_prfx, max(t.id_num) as latest_num from 
    (select substring(id, 1, 3) as id_prfx, 
    cast(substring(id,4) as integer) as id_num) t 
    group by id_prfx 

これはあなたが各プレフィックスのための最高の部品番号を取得し、結果表が得られます。

あなたは本当に唯一の「ABC」の接頭辞をしたい場合は、:

select max(cast(substring(id,4) as integer)) as max_num from table 
where id LIKE 'ABC%' 
+0

なぜなら、私たちが 'ABC001'、 'ABC002'、 'ABC003'& ' ABC005 'と私はそれが' ABC004 'になる次の利用可能なものを見つけることを希望します – Spence

関連する問題