勉強したことのメモ

webプログラマが勉強したことのメモ。

MySQLでグループ毎に連番を設定する方法

   

MySQLでオートインクリメントを使用せずにグループ毎で連番を割り振りたかった。具体的には掲示板を作成する案件がありスレッド毎にレスナンバーを表示させたかった。以下に方法をメモ。

 

SQL文

phpmyadminやadminerからは以下SQL文でgroup_idごとに連番(no)が割り振られる。

 

PHPからSQL文を発行する場合は以下になる。

 

ページングにも対応させたい

掲示板だと数十件ほどの書き込みごとに「次のページへ」等のページングが必要になるが、先述のソースだとページが切り替わるごとに上からレスナンバーが1~とリセットされてしまう。

そのような場合は以下のように変更することでページが切り替わってもレスナンバーが正常に表示されるようになる。

 

アットマークとかコロンとかは何?

今回作成したSQL文は参考サイトを元にしたが、アットマークとかコロンなど平素では使用しない記述が多数見受けられた。

@(アットマーク)

変数を利用する際に使用する。PHPでいう$マークみたいなものっぽい。

:=(コロン・イコール)

イコールと同じ、もしくは代入の際に使用する。例えば以下だとnoという変数に0を代入するという意味になる。

IF(@group_id <> group_id, @no:=1, @no:=@no+1) AS noの部分

IF~からASまでの部分は参考演算子とのこと。group_idが等しくない場合はnoは1、同じ場合は+1とする。つまり同じグループであればインクリメントしていくといったもの。その値をnoカラムとして受け取られる(AS no部分)。

 

参考サイト

https://qiita.com/toyottoyo/items/813338f4756dee41e49b

https://style.potepan.com/articles/15271.html

 - MySQLi, データベース

  関連記事

MySQLiでFOUND_ROWS(全件数取得)

MySQLiでFOUND_ROWS(全件数取得)。 $sql = ' SELEC ...

MySQLで1日の起点を変更する方法

MySQLで1日毎の集計を行う際、例えば2020/01/01のデータは2020/ ...

MySQLiでSELECT文

MySQLiでSELECT文 ■データ +--+------+ | id | p ...

mysqliで検索

今後、PHPでmysql関数はエラーでる! という話を聞き、 取り急ぎmysql ...

MySQLiでDELETE文

MySQLiでDELETE文 ■ソース $mysqli = new mysqli ...

MySQLiでUPDATE文

MySQLiでUPDATE文 ■ソース $mysqli = new mysqli ...

PHPからMySQLデータを取得した際に一括で配列に入れる方法

MySQLからデータを取得して、PHP側で配列に入れる際に今まで一個ずつ書いてい ...

MySQLiで直近に挿入したオートインクリメントの値と次回挿入する値を取得する方法

phpとmysqliを使っている中で次回挿入するオートインクリメントの値と、前回 ...

MySQLiでINSERT文

MySQLiでINSERT文 ■ソース $mysqli = new mysqli ...