My SQL(MariaDB) 同じテーブル同士を結合する

スポンサーリンク
スポンサーリンク

はじめに

+—-+———-+——+——-+————+
| id | order_id | side | price | related_id |
+—-+———-+——+——-+————+
|  1 |        1 | buy  |   100 |          2 |
|  2 |        2 | sell |   150 |       NULL |
|  3 |        3 | buy  |   200 |          4 |
|  4 |        4 | sell |   150 |       NULL |
+—-+———-+——+——-+————+

上のようなテーブルがあったとして、これを購入時のカラムと売却時のカラムからなるように、抽出したい。

+—-+——–+———–+———+————+
| id | buy_id | buy_price | sell_id | sell_price |
+—-+——–+———–+———+————+
|  1 |      1 |       100 |       2 |        150 |
|  3 |      3 |       200 |       4 |        150 |
+—-+——–+———–+———+————+

仮想通貨や株の売買の管理に使うことを想定しています。

テーブルの作成

create table test01(id int auto_increment,order_id bigint, side varchar(16), price int, related_id int, index(id));

id,order_id,side,price,retated_id のカラムからなるテーブルを作成します。
idはオートインクリメントを設定し、自動的に採番されるようにします。order_id は注文idです。sideは売りか買いの区分、priceは価格です。
related_id 関連idですが、これが重要です。buy と sell 2つのレコードがあったとして、buyのrelated_idに sell のidを入れておくことで、buyのレコードとsellのレコードを結合することが出来るようになります。

データを幾つか挿入してみます。

–挿入
insert into test01 (order_id, side,price) values(1,‘buy’,100);
insert into test01 (order_id, side,price) values(2,‘sell’,150);
–更新
update test01 set related_id=1 where id=2;

結果を出力します。

select * from test01;
+—-+———-+——+——-+————+
| id | order_id | side | price | related_id |
+—-+———-+——+——-+————+
|  1 |        1 | buy  |   100 |          2 |
|  2 |        2 | sell |   150 |       NULL |
+—-+———-+——+——-+————+

 

自己結合

–自己結合
 select A.id,A.order_id,A.side,A.price,B.order_id,B.side,B.price
 from test01 as A left join test01 as B on A.related_id = B.id;

from以下で test01というテーブルに対して A B という別名をつけてます。
A.related_id と一致する B.idを探して結合します。Aを左、Bを右に配置します。

/*結果
+—-+———-+——+——-+———-+——+——-+
| id | order_id | side | price | order_id | side | price |
+—-+———-+——+——-+———-+——+——-+
|  1 |        1 | buy  |   100 |        2 | sell |   150 |
|  2 |        2 | sell |   150 |     NULL | NULL |  NULL |
+—-+———-+——+——-+———-+——+——-+
*/

 

NULLがでてくるのが嫌なので、NULLの行を消します。
where B.order_id is not null
で、右側 B.order_id が nullの行を出力しません。

select A.id,A.order_id,A.side,A.price,B.order_id,B.side,B.price
from test01 as A left join test01 as B on A.related_id = B.id where B.order_id is not null;
/*結果
+—-+———-+——+——-+———-+——+——-+
| id | order_id | side | price | order_id | side | price |
+—-+———-+——+——-+———-+——+——-+
|  1 |        1 | buy  |   100 |        2 | sell |   150 |
+—-+———-+——+——-+———-+——+——-+
*/

 

同じカラムがあって分かりにくいので、左側と右側のカラムに別名を付けます。

select A.id,A.side,A.order_id as buy_id,A.price as buy_price,
B.order_id as sell_id,B.price as sell_price
from test01 as A left join test01 as B on A.related_id = B.id where B.order_id is not null;

A sideはBuy 位置で言うと左側の A.order_id を buy_idに A.priceを buy_priceに
B.order_idを sell_idに B.priceをsell_priceに別名定義します。

/*結果
+—-+——+——–+———–+———+————+
| id | side | buy_id | buy_price | sell_id | sell_price |
+—-+——+——–+———–+———+————+
|  1 | buy  |      1 |       100 |       2 |        150 |
+—-+——+——–+———–+———+————+
*/

 

SQL関係でよく見るサイト

MySQLの使い方
MySQL は世界中で広く利用されているリレーショナルデータベース管理システム(RDBMS)の一つです。ここでは MySQL 入門として MySQL をこれから使われる方を対象として MySQL をローカル環境にインストールする方法や、 MySQL でデータベース、テーブル、ユーザー、トリガなどを作成する方法に関して、...

 

 

スポンサーリンク
スポンサーリンク
開発 備忘録
スポンサーリンク
アパトサウルスをフォローする
アパトサウルスのブログ

コメント

タイトルとURLをコピーしました