テーブル構造
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 |
+---------+------------+-------------+