実務でいろいろとトラブルがあり、データベースから在庫データを見てくれ~なんて依頼がありましたんでSQLをごりごり書いていたんですが、普段使わないようなSQLの構文を使ったのでここでちょっと紹介します。
group_concat
グルーピングした項目でグルーピングにならないデータを抽出する方法です。
テーブル名 product
id|category|product_name
1| a | りんご
2| a | みかん
3| a | かき
4| b | パソコン
5| b | スマホ
上記みたいなデータがあったとして、
a|りんご、みかん、かき
b|パソコン、スマホ
みたいな出し方をしたいときですね。この場合group_concatで下記のように書けばOKです。
1 |
SELECT category , group_concat( product_name separator ',') as product_name from products |
これは汎用性が結構あるかとおもい、なぜ今までしらなかったんだろうと若干後悔しました。ちなみにつなげる項目のソートもできます。詳しくは下記参照
MySQLのgroup_concatで複数レコードを1行にまとめる
substring_index
文字列の分割でPHPのexplodeやperlのsplitにあたります。リンクのほうがわかりやすいのでそのまま張ります。
MySQL 関数リファレンス 区切り文字列N個目までの文字列を取り出す (SUBSTRING_INDEX)
cast
ソートをするときに使います。例えば1,2,11という文字があったとして、これを昇順にソートする場合、人間だと1 2 11と数値と判断して並べますが、文字だと1,11,2になってしまいます。これを防ぐために001,002とやるのが正しいのですが、そうでないときは無理数字に変換する必要があります。
その場合下記のように書けば数値になります。
sampleTableにcolという列があり、文字が入っているものを数値化したい場合、下記のように書けばOKです。
1 2 3 4 |
SELECT CAST( col as signed ) as num FROM sampleTable |
union
union自体は知っていたのですが、MySQLでfull outer joinが使えないときに使えると知りました。
これまたリンク先がよくできているので任せます(爆)
【MySQL5.6】完全外部結合(FULL OUTER JOIN)のやりかた