MySQL: bit shiftして値を抽出

以下のような3つのテーブルがあったとする。

mysql> select * from people;
+----+--------------+
| id | name         |
+----+--------------+
|  1 | 石川遼       |
|  2 | 斎藤佑樹     |
+----+--------------+
2 rows in set (0.00 sec)

mysql> select * from spec_keys;
+----+-----------+
| id | name      |
+----+-----------+
|  1 | 身長      |
|  2 | 誕生年    |
+----+-----------+
2 rows in set (0.00 sec)

mysql> select * from specs;
+-----------+---------+---------+
| person_id | key_int | val_int |
+-----------+---------+---------+
|         2 |       1 |     176 |
|         2 |       2 |    1988 |
|         1 |       1 |     175 |
|         1 |       2 |    1991 |
+-----------+---------+---------+
4 rows in set (0.00 sec)

specとは、人物の付随情報を表すことを目的としたテーブルで、
普通のrelationalテーブルで、石川遼が1991年生まれ、
といったことがわかるようにしている。

データを抽出するときにちょっと細工をして、
以下のようにbit shiftとbit演算をして抽出してみる。
mysql> select person_id, key_int << 16 | val_int from specs;
+-----------+-------------------------+
| person_id | key_int << 16 | val_int |
+-----------+-------------------------+
|         2 |                   65712 |
|         2 |                  133060 |
|         1 |                   65711 |
|         1 |                  133063 |
+-----------+-------------------------+
4 rows in set (0.00 sec)

これにより、一見してどういうデータかわからなくなるが、
spec_keyとspec_valueのフィールドを1つにまとめることができ、
また、valueがintであるので、後々、範囲でも調べることができる。

制約としては、valueが16bit(65536)を超えない値であることや、
key数にも上限値が下がる。

こんなことをして、何がしたいかはまた別で書く。



人気の投稿