[英]Join multiple tables and sum results for each row in first table
我為商店統計信息創建有效的sql查詢時遇到問題。 我有三個表:category,product_categories和orders_products。
表格類別 -包含類別列表和結構外觀(簡短版本):
id
name
表product_categories-包含產品和類別之間的連接。 簡短版本的結構:
id
product_id
category_id
表orders_products-包含商店中出售的所有產品。 結構如下:
id
product_id
price
quantity
我要做的是顯示帶有類別名稱和當前類別的已售商品價值的表格。
當我有2000多個類別,每個類別中有20多個項目以及許多已售出項目時,就會出現問題。
我試過了:
1)在一個簡單的查詢中獲取所有類別
2)foreach他們(在php中),並使用join用於products_catogories和orders_products
SELECT orders_products.id,orders_products.product_price_gross,orders_products.product_qty,orders_products.option_price,orders_products.rebate
FROM product_categories
LEFT JOIN orders_products
ON product_categories.product_id = orders_products.product_id
3)Foreach結果在PHP和總和值
4)顯示結果
5)效果-在foreach中超過50個類別時掛起db。
我不知道如何優化這么多數據的查詢。 我希望您能對此有所幫助,因為我對join不太滿意。
親切的問候馬克
您可以一步完成所有這些工作,讓MySQL為您執行這些計算:
SELECT categories.name,
SUM(order_products.price * order_products.quantity)
FROM order_products
LEFT JOIN product_categories ON product_categories.product_id = order_products.product_id
LEFT JOIN categories ON product_categories.category_id = categories.id
GROUP BY categories.name,
categories.id
這只會返回類別的總和,其中至少包含一次購買。 參見此示例sqlfiddle 。
我進一步開發了SQL查詢( 新的小提琴 ),以包括每個類別的數量,並通過將JoOIN改過來,將沒有銷售的“空”類別添加到結果中:
SELECT categories.name,
Ifnull(Sum(order_products.quantity), 0) AS quantity,
Ifnull(Sum(order_products.price * order_products.quantity), 0) AS `Total Sales`
FROM categories
LEFT JOIN product_categories ON product_categories.category_id = categories.id
LEFT JOIN order_products ON product_categories.product_id = order_products.product_id
GROUP BY categories.name,
categories.id
我不確定,但是您可以嘗試一下,
SELECT orders_products.id,sum(orders_products.product_price_gross),sum(orders_products.product_qty),sum(orders_products.option_price),sum(orders_products.rebate)
FROM product_categories
LEFT JOIN orders_products
ON product_categories.product_id = orders_products.product_id group by product_categories.category_id
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.