mysql

MySQL TIPS 1 怪盗ロワイヤルのように3分に1ポイント回復

MySQLネタもそろそろ尽きてきたので、趣向を変えてMySQLの実践Tipを紹介していこうと思います。 まずは怪盗ロワイヤルのように3分に1ポイント回復する実装について以下のように3分に一度バッチを回して、全ユーザの体力を+1ずつアップデートするのは効率が悪…

裏MySQLクエリー入門(22) ユーザ変数を使った経験値テーブル

CREATE TABLE `lv` ( `lv` INT NOT NULL AUTO_INCREMENT PRIMARY KEY COMMENT 'レベル', `exp` INT NOT NULL COMMENT '必要経験値' ) ENGINE = MYISAM COMMENT = 'レベルテーブル'; INSERT INTO `lv` (`exp`) VALUES ('100'),('200'),('350'),('600'),('900'…

裏MySQLクエリー入門(21) 応用編6 ユーザ変数を使ったランキングの順位付け

ユーザ変数を使う代表例としてランキング系のテーブルで順位表示をしたい場合 以下のようなランキングテーブルを用意します。 CREATE TABLE `ranking` ( `ranking_id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY COMMENT 'ランキングID', `category_id` INT N…

裏MySQL入門(20) 基礎編12 テンポラリーテーブル

テンポラリーテーブルはその名のとおり、DB上に一時的にデータを格納するテーブルを作成する機能です。テンポラリーテーブルは『create temporary table テーブル名』とcreate table文にtemporaryを指定することで作ることができます。 この作成されたテーブ…

裏MySQLクエリー入門(19) 応用編5 UPDATE文でカラムの値を入れ替えたい

CSVのインポートなどでカラム(列)の順番を間違ってしまったときなどに以下のようなSQLで値を入れ替えることができそうですが、 set @str = 0; update `charactor` set `str` = `grd`, `grd` = `int`, `int` = `agi`, `agi` = `dex`, `dex` = `vit`, `vit` = …

裏MySQLクエリー入門(18) 応用編4 バルクアップデート(2)

前回のエントリーでINSERT ON DUPLICATE KEY UPDATEを紹介しましたが、これを使うとeltやfieldを使ったバルクアップデートではなく、重複するキーが既に存在するという前提であれば、バルクアップデートとして使用できます。用途としては、CSVアップロードや…

裏MySQL入門(17) 基礎編11 REPLACE or INSERT ON DUPLICATE KEY UPDATE

MERGE,UPSERTと言われる、UPDATE文とINSERT文を条件によって自動的に切り替えることができるSQL文は、MySQLでは2種類用意されています。 REPLACE、INSERT ON DUPLICATE KEY UPDATEです。それぞれの違いは REPLACE INSERT文と同じ構文でINSERTの部分をREPLACE…

phpでFizzBuzz

最近は、必ずといってもいいほどあるプログラムの実技試験。 phpでFizzBuzzをおさらい。 といってもただ単にやっても面白く無いので、forを使わないで配列を用いた天邪鬼ver

裏MySQLクエリー入門(16) 番外編2 ENUM型 SET型

カテゴリーの最大数を64以下にすることが可能であれば、カンマ区切りのvarchar型のように非効率な方法ではなく、ビットをフラグとして使うことによって効率よく格納できます。 ALTER TABLE `platform` ADD `set_program_id` BIGINT NOT NULL COMMENT 'プログ…

裏MySQLクエリー入門(15) 応用編3 MySQLで連番の仮想表を作成

postgresには連番の仮想表を作成できるgenerate_seriesという便利な関数があります。これは存在しない日付などを作るときに便利な関数です。MySQLではこのような関数はないのでユーザ変数を用いて擬似的に再現してみましょう。 SELECT 0 generate_series FRO…

裏MySQLクエリー入門(14) 番外編1 複数カテゴリーの正しいデータの持ち方

裏MySQLクエリー入門(13)で出したサンプルですがデータ構造としては最悪です。これは実際に遭遇したデータ構造なのですが、これは、プログラマーがメインの人が良くやってしまうデータ構造ですね。カテゴリーIDを文字列として、カンマ区切りで格納...。気持…

裏MySQLクエリー入門(13) 基礎編10 MySQLの自動型変換

前回の裏MySQLクエリー入門(13) でINT型のprogram_idとVARCHAR型でprogram_idがカンマ区切りのprogram_idsを結合すると一見すると動作しているよう*1に見えます。 SELECT * FROM `platform` pf, `program` pg WHERE pg.program_id = pf.program_ids platform…

裏MySQLクエリー入門(12) 基礎編9 FIND_IN_SET

先週は、仕事で燃え尽きて萌えかす*1程の気力しか残っていなかったIT7Cです。今日はMySQLの文字列関数FIND_IN_SETについて紹介したいと思います。FIND_IN_SETは、カンマ区切りの文字列から任意の文字列を取り出す、GROUP_CONCATの逆の関数みたいなものです。…

裏MySQLクエリー入門(11) 実践編1 集約関数 BIT_AND,BIT_OR,BIT_XOR

MySQLの集約関数にはBIT_AND,BIT_OR,BIT_XOR等、ビット演算子系の集約関数があります。具体的な使用例をあまりみることがないので、今回はこの関数の使いどころを紹介したいと思います。例えばユーザーのアイテムテーブルからアイテムID 1,3,5,7の全ての取得…

裏MySQL クエリー入門 (10) 基礎編8 UNION ALLによる仮想表

仮想表の作成、わざわざ新規にテーブルを作るまでもないようなデータ量の場合以下のようにUNION ALLを使うことにより、仮想的にテーブルを作ることが可能です。プライマリキーと値(Key value)しかない場合にはeltまたは、field + eltで十分です。こちらを使…

裏MySQL クエリー入門 (9) 基礎編7 動的クエリー

MySQLで動的クエリーを実行する為にプリペアド ステートメントを使います。PREPAREでSQLを定義し、EXECUTEでPREPAREで定義したSQLを実行します。 PREPARE stmt_name FROM preparable_stmt EXECUTE stmt_name [USING @var_name [, @var_name] ...] UPDATE型の…

裏MySQL クエリー入門 (8) 基礎編6 GROUP_CONCAT

GROUP_CONCATは、グループ内の文字列を、指定された区切り文字で結合する。集約(GROUP)関数です。文字列版のSUMのようなものですね。phpで言えばimplodeみたいなものです。ここでは、裏MySQL クエリー入門 (7) のサンプルをカンマ区切りにしてみましょう。 …

裏MySQLクエリー入門(7) 基礎編5 InformationSchema

InformationSchemaとは、テーブル名やカラム名などのシステム情報をテーブルの形でみせるシステムテーブルでSQLでいろいろ情報を取得できます。unixで言うところのprocシステムですね。SQLでシステム情報にアクセスできることで、システム情報と既存のテーブ…

裏MySQLクエリー入門(6) 基礎編4 SQLでSQLを作る

このTIPSはRDBMSすべてで共通で使えるテクニックなので、知っている人も多くいると思いますが、今後の応用編で必須になってきますのでおさらいしておきましょう。 例えば結合するテーブルが多すぎる場合など、何個かのSQLに小分けすることでJOINを回避するこ…

裏MySQL クエリー入門 (5) 応用編2 バルクアップデート

複数行をまとめてINSERTできるMySQLのバルクインサートはわりかし有名です。というか、世間的にはRDBMSなら、えっできて当然でしょっというような勢いですが、RDBMSの標準機能ではないです。はい。よくmysqldumpでダンプしたデータが、他のRDBMSに流し込んだ…

裏MySQL クエリー入門(4) 応用編1 クロス集計

基礎編が終わりましていよいよここから、応用編に入っていきます。MySQLでクロス集計を行うには、一般的に裏MySQL クエリー入門(1)で紹介しましたfieldを使います。 これは、MySQLでクロス集計する場合にわりと知られた方法です。field関数を使用する際に、…

裏MySQL クエリー入門 基礎編3 (3) ユーザ変数

MySQLのユーザ変数はSQL中で使える変数をDB側で持てるという機能です。 使い方についてはMySQLのマニュアルユーザ変数を参考にして頂くとして、現在、他のRDBMSでは専用のクエリーが用意されているものについて、このユーザ変数を活用することでMySQLで解決…

裏MySQL クエリー入門 基礎編2 (2) 条件式の結果は1(真)か0(偽)

裏MySQL クエリー入門 基礎編2MySQLのクエリーはわりとシンプルで、php等のプログラミング系の実装と同じで、条件式の結果は1(真)か0(偽)が返ってきます。 ですので、WHERE句の条件式は、以下のように最終的に条件式の結果1(真)か0(偽)が返っているというこ…

裏MySQL クエリー入門 (1) ELTとFIELD

ブログコンテストも終わってしまったので、MySQLの実践TIPSを書いていこうと思います。 一般的なSQLの他のサイトの解説に譲るとして、ちょっと横道にそれて、MySQL独自関数を使った実践TIPSを紹介していきたいと思います。まず第一弾は『ELT/FIELD』、MySQL…