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

# テーブル構造

```
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 |
+---------+------------+
| 山田さん  | いちご       |
| 斎藤さん  | りんご       |
| 山田さん  | いちご       |
| 川上さん  | ブルーベリー   |
+---------+------------+
```

この２つのリレーションを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          |
+---------+------------+-------------+
```