###実現したいこと
レコードの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
プレビュー