やりたいこと
下記テーブルから商品の
sum(sales_products.quantity)(注文数合計)
、
categories.taxonomy_id(カテゴリー分類ID)
、
sales.office_id AS office_id(販売事業所ID)
を
categories.taxonomy_id(カテゴリー分類)
、
sales.office_id AS office_id(販売事業所ID)
でグループ化して取得したい。
困っていること
salesテーブル => orderテーブル
, event_salesテーブル
, event_orderテーブル
sales_productsテーブル => order_productsテーブル
、 event_sales_productsテーブル
, event_order_productsテーブル
といったように似たテーブルが他に3種類あり、
下記コードのように合計で3回データベースから取得するのでかなりの時間がかかってしまいます。
少しでもパフォーマンスをよくしたいのですが、どのようにしたらよいでしょうか?
アドバイスお願いします。
テーブル
sales(注文)テーブル (5万くらい)
|id|shop_id|office_id|date|
|:--|:--:|--:|
|1|1|1|0000-00-00|
|2|1|2|0000-00-00|
|3|1|2|0000-00-00|
sql
1// CREATE 2CREATE TABLE `sales` ( 3 `id` int(11) NOT NULL AUTO_INCREMENT, 4 `shop_id` int(11) NOT NULL, 5 `office_id` int(11) NOT NULL, 6 `date` date NOT NULL, 7 PRIMARY KEY (`id`) 8) ENGINE=InnoDB AUTO_INCREMENT=53158 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
sales_products(注文商品)テーブル(300万くらい)
|id|sales_id|product_id|quantity|
|:--|:--:|--:|
|1|1|1|5|
|2|1|3|7|
|3|1|2|7|
sql
1// CREATE 2CREATE TABLE `sales_products` ( 3 `id` int(11) NOT NULL AUTO_INCREMENT, 4 `sales_id` int(11) NOT NULL, 5 `product_id` int(11) NOT NULL, 6 `quantity` int(11) NOT NULL, 7 PRIMARY KEY (`id`) 8) ENGINE=InnoDB AUTO_INCREMENT=2504749 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
products(商品)テーブル(3万くらい)
id | category_id | name |
---|---|---|
1 | 1 | 商品1 |
2 | 1 | 商品2 |
3 | 1 | 商品3 |
sql
1// CREATE 2CREATE TABLE `products` ( 3 `id` int(11) NOT NULL AUTO_INCREMENT, 4 `category_id` int(11) NOT NULL, 5 `name` varchar(50) COLLATE utf8_unicode_ci NOT NULL, 6 PRIMARY KEY (`id`) 7) ENGINE=InnoDB AUTO_INCREMENT=28449 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci; 8 9// INSERT 10$sql = "INSERT INTO products (category_id, name) VALUES (:category_id, :name)";
categories(商品カテゴリー)テーブル(200くらい)
id | taxonomy_id | name |
---|---|---|
1 | 1 | カテゴリー1 |
2 | 1 | カテゴリー2 |
3 | 1 | カテゴリー3 |
sql
1// CREATE文 2CREATE TABLE `categories` ( 3 `id` int(11) NOT NULL AUTO_INCREMENT, 4 `taxonomy_id` int(11) NOT NULL, 5 `name` varchar(100) COLLATE utf8_unicode_ci NOT NULL, 6 PRIMARY KEY (`id`) 7) ENGINE=InnoDB AUTO_INCREMENT=174 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
コード
php
1$sql = 2"SELECT 3 sum(sales_products.quantity) AS sum_quantity, 4 categories.taxonomy_id AS taxonomy, 5 sales.office_id AS office_id 6FROM sales, sales_products, products, categories 7WHERE sales.id = sales_product.sales_id 8AND sales_products.product_id = products.id 9AND product.category_id = categories.id 10AND (sales.date BETWEEN :from AND :to) 11GROUP BY categories.taxonomy_id, sales.office_id"; 12 13$stmt = $this->dbh->prepare($sql); 14$data = array( 15 ':from' => $from, 16 ':to' => $to 17); 18$stmt->execute($data); 19$rec = $stmt->fetchAll(PDO::FETCH_ASSOC);
php
1// 他テーブルも以下のように取得 2$sql = 3"SELECT 4 sum(order_products.quantity) AS sum_quantity, 5 categories.taxonomy_id AS taxonomy, 6 order.office_id AS office_id 7FROM order, order_products, products, categories 8WHERE order.id = order_product.sales_id 9AND order_products.product_id = products.id 10AND product.category_id = categories.id 11AND (order.date BETWEEN :from AND :to) 12GROUP BY categories.taxonomy_id, order.office_id"; 13 14$stmt = $this->dbh->prepare($sql); 15$data = array( 16 ':from' => $from, 17 ':to' => $to 18); 19$stmt->execute($data); 20$rec = $stmt->fetchAll(PDO::FETCH_ASSOC);
回答3件
あなたの回答
tips
プレビュー