【MySQL】複数行の結果を一行にまとめて返す

MySQLで複数行の結果を1行にまとめるにはGROUP_CONCAT関数を使用します。

SEPARATORで区切られた文字列で返ってきます。

どんなときに使うかというと、
たとえば
・USERテーブルにユーザー情報
・ADDRESSテーブルに住所情報
が入っていたとして、各ユーザーは住所が複数登録されている可能性があるとします。
(大手ECサイトでユーザーが住所を複数登録できるというようなイメージです。)
このとき
「全ユーザーの全住所を取得して、ユーザーごとにまとめて表示したい」
となったとき、3つの方法があります。

・SQLでUSERを取得し、USERの1件ずつに対して、またSQLでADDRESSを取得する。
・SQLでサブクエリーを使って全USERの全ADDRESSを取得して、プログラム側でUSERごとにまとめる
・SQLでGROUP_CONCATを使ってUSERごとにADDRESSをまとめた状態で取得する

3番目が一番スマートに取得できますよね。
ただし、SQLがあまり複雑になるとパフォーマンスが低下する場合がありますので、
プログラム側でやったほうがよいケースもあります。

【MySQL】文字列の一部を一括置換する

UPDATE文でデータを一括で変更する際に、
「文字列の一部を置換したい」ということがあると思います。

REPLACE関数を使えば簡単です。

【MySQL】自前でプライマリキーを採番してINSERT

MySQLには自動で採番するAUTO_INCREMENTという設定があります。
基本的にはこれを使えば自動的にユニークな番号を採番してくれるのですが、
データを頻繁に削除したり、テーブルをコピーしたりしていると
AUTO_INCREMENTの値が重複したり、過去に削除したデータと同じ値になってしまったりと
いろいろと怖いリスクがあります。
そのリスクを避けるため、私はINSERT文を実行する関数の中で自前で採番するようにしています。

【MySQL】order byで文字列カラムを数値としてソートする

カラムがvarchar型だけど数値としてソートしたい場合です。

のようにそのまま指定すると

という感じで文字列としてソートされてしまいます。

数値としてソートしたいときはLPAD関数でゼロ埋めをします。

20ケタにしたのはあくまで例ですが、
ゼロ埋めをすることで数値の大きい順、小さい順にソートできます。