###実現したいこと
レコードのINSERT時に、「グループごとのカラムの最大値+1」を自動で入れたいのですが、そんな都合のいい方法ございますか?
###テーブル構成
以下はコメントのテーブルで、order_numberでコメントの並び順が指定されています。
尚、order_numberはユーザーが任意に変更できるようになっています。
SQL
1CREATE TABLE p_comments 2 (`ID` int, `thread_ID` int, `order_number` int) 3; 4 5INSERT INTO p_comments 6 (`ID`, `thread_ID`, `order_number`) 7VALUES 8 (100, 11, 1), 9 (101, 12, 1), 10 (102, 13, 1), 11 (103, 11, 2), 12 (104, 13, 2), 13 (105, 12, 2), # thread_ID = 12 の最大 14 (106, 11, 3), 15 (107, 13, 3), # thread_ID = 13 の最大 16 (108, 11, 4) # thread_ID = 11 の最大 17;
例えばスレッドthread_ID = 12にコメントすると以下実行しますが、このとき同一スレッドにおけるorder_numberを自動で最大としてorder_number = 3を入れたいということです。
(現状のthread_ID = 12の最大のorder_numberは2であるためです。)
SQL
1INSERT INTO p_comments 2 (`ID`, `thread_ID`, `order_number`) 3VALUES 4 (109, 12, 3) 5;
###試している方法
クエリを2回発行すれば、目的は達成できることがわかりました。
つまりまず1回目に以下を実行して最大のorder_numerである2を得ます。
続いてPHPでその2に+1して、2回目のクエリで上記を実行するという方法です。
ですがこの2回のクエリにやや冗長さを覚えましたために、もし1回で済ませることができればと思い質問させて頂きました。
SQL
1SELECT `order_number` 2FROM `p_comments` 3WHERE thread_ID = 12 4ORDER BY `order_number` 5DESC LIMIT 1;
また、検索しますと以下リンクを見つけまして、
[MySQL] 連番をINSERTと同時に挿入する方法
https://b.0218.jp/20121112133354.html
この方法に従って次のSQLを実行したのですが、実現には至りませんでした。
SQL
1INSERT INTO p_comments( `order_number`, `ID`, `thread_ID` ) 2SELECT COALESCE(MAX(`order_number`)+1,1), ?, ? 3FROM p_comments;
###発生している問題
上記「実現には至りませんでした」について詳細補足します。
エラーはないのですが、order_numberが想定より大きな数字になってしまいます。
例えば現状でthread_ID = 12には2件のレコードがあったとして、order_numberは最大2ということですが、そこに上記実行しますとorder_numberに227が入るといった感じです。
この227が何の数字なのかわかりません。p_commentsテーブルのレコードは2121件ですし、思い当たるフシがないです。
さらにその上でもう一度実行すると228が入りこれは227の次なので正常ですが、そもそも227でなく3を入れたかったので困っています。
###バージョン
MySQLは5.7ですが、もし上位のバージョンでのみ可能であればアップデートも視野に入れています。
宜しくお願い致します。
回答2件
あなたの回答
tips
プレビュー