0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

SQL演習/3重外部リレーション、グルーピング、ソート

Posted at

テーブル構造

mysql> SHOW TABLES;
+---------------+
| Tables_in_mydb|
+---------------+
| carts         |
| my_items      |
| makers        |
+---------------+
mysql> SELECT * FROM carts;
+----+---------+-------+
| id | item_id | count |
+----+---------+-------+
| 1  | 1       | 5     |
| 2  | 2       | 3     |
| 4  | 1       | 3     |
| 6  | 1       | 2     |
+----+---------+-------+
mysql> SELECT * FROM my_items;
+----+-----------+------------+-------+------------------+-------+
| id | makers_id | items_name | price | keyword          | sales |
+----+-----------+------------+-------+------------------+-------+
| 1  | 1         | いちご      | 180   | 赤い,甘い,ケーキ     | 5     |
| 2  | 2         | りんご      | 90    | 丸い,赤い,パイ       | 20    |
| 3  | 1         | バナナ      | 120   | パック,甘い,黄色     | 18    |
| 4  | 3         | ブルーベリー | 200    | 袋入り,青い,眼精疲労 | 8     |
+----+-----------+------------+-------+------------------+-------+
mysql> SELECT * FROM makers;
+----+---------+-------------+
| id | name    | address     |
+----+---------+-------------+
| 1  | 山田さん | 東京都港区    |
| 2  | 斉藤さん | 北海道小樽市   |
| 3  | 川上さん | 神奈川県横浜市 |
+----+---------+-------------+

最終目標

「商品ごとの販売状況を多い順に、生産者名、商品名とともに表示する」
cartsからcount
my_itemsからitems_name
makersからname
を抽出し、
cartsのitem_idでグループ化し、
countを合計し、
countの表示名をsales_countに変え、
sales_countで降順に配列

carts全抽出

mysql> SELECT * FROM carts;
+----+---------+-------+
| id | item_id | count |
+----+---------+-------+
| 1  | 1       | 5     |
| 2  | 2       | 3     |
| 4  | 1       | 3     |
| 6  | 1       | 2     |
+----+---------+-------+

cartsとmy_itemsをitem_idでリレーション(carts基準)

SELECT * FROM carts LEFT JOIN my_items ON carts.item_id=my_items.id;
+----+---------+-------+----+-----------+------------+-------+------------------+-------+
| id | item_id | count | id | makers_id | items_name | price | keyword          | sales |
+----+---------+-------+----+-----------+------------+-------+------------------+-------+
| 1  | 1       | 5     | 1  | 1         | いちご      | 180   | 赤い,甘い,ケーキ     | 5     |
| 2  | 2       | 3     | 2  | 2         | りんご      | 90    | 丸い,赤い,パイ       | 20    |
| 4  | 1       | 3     | 1  | 1         | いちご      | 180   | 赤い,甘い,ケーキ     | 5     |
| 6  | 1       | 2     | 1  | 1         | いちご      | 180   | 赤い,甘い,ケーキ     | 5     |
+----+---------+-------+----+-----------+------------+-------+------------------+-------+

抽出を絞り込む

SELECT my_items.items_name, carts.count FROM carts LEFT JOIN my_items ON carts.item_id=my_items.id;
+------------+-------+
| items_name | count |
+------------+-------+
| いちご       | 5     |
| りんご       | 3     |
| いちご       | 3     |
| いちご       | 2     |
+------------+-------+

ここにmakers.nameをリレーションさせる

carts基準のリレーション

SELECT my_items.items_name, carts.count FROM my_items LEFT JOIN carts ON my_items.id=carts.item_id;
+------------+-------+
| items_name | count |
+------------+-------+
| いちご       | 5     |
| りんご       | 3     |
| いちご       | 3     |
| いちご       | 2     |
+------------+-------+

my_items基準のリレーション

SELECT makers.name, my_items.items_name FROM my_items LEFT JOIN makers ON my_items.makers_id=makers.id;
+---------+------------+
| name    | items_name |
+---------+------------+
| 山田さん  | いちご       |
| 斎藤さん  | りんご       |
| 山田さん  | いちご       |
| 川上さん  | ブルーベリー   |
+---------+------------+

この2つのリレーションをcarts基準で合体させる

SELECT makers.name, my_items.items_name, carts.count FROM ((carts LEFT JOIN my_items ON my_items.id=carts.item_id)LEFT JOIN makers ON my_items.makers_id=makers.id);
+---------+------------+-------+
| name    | items_name | count |
+---------+------------+-------+
| 山田さん  | いちご       | 5     |
| 斎藤さん  | りんご       | 3     |
| 山田さん  | いちご       | 3     |
| 山田さん  | いちご       | 2     |
+---------+------------+-------+

carts.countを集計しitem_idごとにまとめる

SELECT makers.name, my_items.items_name, SUM(carts.count) FROM ((carts LEFT JOIN my_items ON my_items.id=carts.item_id)LEFT JOIN makers ON my_items.makers_id=makers.id) GROUP BY carts.item_id;
+---------+------------+-------+
| name    | items_name | count |
+---------+------------+-------+
| 山田さん  | いちご       | 10    |
| 斎藤さん  | りんご       | 3     |
+---------+------------+-------+

集計カラム名を変更

SELECT makers.name, my_items.items_name, SUM(carts.count) AS sales_count FROM ((carts LEFT JOIN my_items ON my_items.id=carts.item_id)LEFT JOIN makers ON my_items.makers_id=makers.id) GROUP BY carts.item_id;
+---------+------------+-------------+
| name    | items_name | sales_count |
+---------+------------+-------------+
| 山田さん  | いちご       | 10          |
| 斎藤さん  | りんご       | 3           |
+---------+------------+-------------+

sales_countで降順ソート

SELECT makers.name, my_items.items_name, SUM(carts.count) AS sales_count FROM ((carts LEFT JOIN my_items ON my_items.id=carts.item_id)LEFT JOIN makers ON my_items.makers_id=makers.id) GROUP BY carts.item_id ORDER BY sales_count ASC;
+---------+------------+-------------+
| name    | items_name | sales_count |
+---------+------------+-------------+
| 斎藤さん  | りんご       | 3           |
| 山田さん  | いちご       | 10          |
+---------+------------+-------------+
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?