简体   繁体   中英

Sum with inner join in PHP

I'm working with PHP and MySQL, and I need to SUM the total amount of products joining 3 tables:

order_products: (There are multiple order products with the same name but different amounts in the table)

order_id        (int)
product_name    (varchar)
product_amount  (int)

orders:

order_id       (int)
order_date     (varchar)
order_status   (varchar)

supplier:

product_name    (varchar)
product_amount  (int)

So, I want to show how many products I sold and status is shipped and how many I ordered from the supplier in one single row. Any of two examples below will help me to achieve my goal.

Like:

Product Name     (sum order_products)      (sum supplier)  Order status

first product           300                  2500          Shipped_Only
second product          50                   400           Shipped_Only
third product           10                   600           Shipped_Only


Product Name     (sum order_products)      (sum supplier)  Order status

first product           2200                 2500          Not_Shipped
second product          400                  400           Not_Shipped
third product           590                  600           Not_Shipped

Are there any examples or other help that I can get to do this?

Edit: Sample Data goes like this

order_products:

order_id       product_name     product_amount

255               product 1         200
256               product 1         100
257               product 2         50
258               product 3         10

orders: order_id order_date order_status

255               09.05.2018         Shipped
256               09.05.2018         Shipped
257               10.05.2018         Not_Shipped
258               10.05.2018         Not_Shipped

supplier: product_name product_amount

product 1         2500        
product 2         400   
product 3         600    

You should use a join on the aggregated subselect.

SELECT t1.product_name, t1.sum_order_products, t2.supplier_sum, t1.order_status 
FROM (
    SELECT op.product_name, SUM(op.product_amount) sum_order_products, o.order_status
    FROM order_products op
    INNER JOIN orders o ON op.order_id = o.order_id 
    WHERE o.order_status = 'Shipped'
    GROUP BY op.product_name, o.order_status
) t1 
LEFT JOIN (
    SELECT s.product_name, SUM(s.product_amount) supplier_sum
    FROM supplier s 
    GROUP BY s.product_name
) t2 ON t1.product_name = t2.product_name 
ORDER BY t1.order_status, t1.product_name

From What I understand, I think this is what you want, please give more clarity if this is not what you are expecting.

You will need to use GROUP BY clause and them you will have to use count() function to count the number of rows for the results coming from Group By Clause. I am writing an example of how to use a group by clause, you will need to modify the query as per your need.

SELECT
 order_products.product_name,
 count(*) as Total_Orders,
 MAX(supplier.product_amount) as Supplier_Amt,
 orders.order_status
FROM supplier
 INNER JOIN order_products ON supplier.product_name = order_products.product_name
 INNER JOIN orders ON orders.order_id = order_products.order_id
WHERE orders.order_status = 'Not_Shipped'
GROUP BY order_products.product_name, orders.order_status;

You will need to queries, you can write the other one, just replace WHERE orders.order_status = 'Not_Shipped' with WHERE orders.order_status = 'Shipped' Also if you want all in a single query, simply remove the where clause.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM