Moshe Shmukler
Moshe Shmukler

Reputation: 1300

MySQL stored procedure architecture

I am working on a piece of code that runs a query against MySQL. The syntax is below:

SELECT `order`.`id` AS `id`,
   IFNULL(product.main_name, product.name) AS `variant`,
   `product`.`id` AS `product_id`,
   `product`.`cost` AS `cost`,
   ROUND(SUM(order.price), 2) AS `price`,
   SUM(order.quantity) AS `quantity`,
   `product`.`sku` AS `sku`,
   ROUND(order.price/order.quantity, 2) AS `avg_price`,
   `product`.`quantity` AS `qty_at_hand`,
   `order`.`fulfillment_channel` AS `fulfillment_channel`,
   0 as `returns`
FROM `order`
LEFT JOIN `product` ON product.sku = order.sku
WHERE (`order`.`account_id`=1)
   AND (`order`.`item_status`<>'Cancelled')
   AND (`order`.`purchase_date` >= $start_date)
   AND (`order`.`purchase_date` <= $end_date)
GROUP BY `order`.`sku`

My order table:

| id                  | int(11)      | NO   | PRI | NULL              | auto_increment |
| user_id             | int(11)      | NO   | MUL | NULL              |                |
| account_id          | int(11)      | NO   | MUL | NULL              |                |
| merchant_order_id   | varchar(255) | NO   |     | NULL              |                |
| purchase_date       | datetime     | NO   |     | NULL              |                |
| updated_date        | datetime     | NO   |     | NULL              |                |
| order_status        | varchar(255) | NO   |     | NULL              |                |
| product_name        | varchar(255) | NO   |     | NULL              |                |
| sku                 | varchar(255) | NO   | MUL | NULL              |                |
| item_status         | varchar(255) | NO   |     | NULL              |                |
| quantity            | int(11)      | NO   |     | NULL              |                |
| currency            | varchar(10)  | NO   |     | NULL              |                |
| price               | decimal(9,2) | YES  |     | 0.00              |                |
| created_at          | datetime     | NO   |     | CURRENT_TIMESTAMP |                |
| fulfillment_channel | varchar(255) | YES  |     | NULL              |                |

My product table:

| id                       | int(11)      | NO   | PRI | NULL    | auto_increment |
| user_id                  | int(11)      | NO   | MUL | NULL    |                |
| account_id               | int(11)      | NO   | MUL | NULL    |                |
| name                     | varchar(255) | NO   |     | NULL    |                |
| main_name                | varchar(255) | YES  |     | NULL    |                |
| description              | text         | YES  |     | NULL    |                |
| listing_id               | varchar(255) | YES  |     | NULL    |                |
| sku                      | varchar(255) | NO   | MUL | NULL    |                |
| open_date                | datetime     | YES  |     | NULL    |                |
| price                    | decimal(9,2) | NO   |     | 0.00    |                |
| quantity                 | int(11)      | YES  |     | NULL    |                |
| supplier_id              | int(11)      | YES  |     | NULL    |                |
| active                   | tinyint(1)   | NO   |     | 1       |                |
| supplier_sku             | varchar(255) | YES  |     | NULL    |                |
| upc                      | varchar(255) | YES  |     | NULL    |                |
| tag                      | varchar(255) | YES  |     | NULL    |                |
| cost                     | decimal(9,2) | NO   |     | 0.00    |                |
| ean                      | int(11)      | YES  |     | NULL    |                |
| min_order_qty            | int(11)      | YES  |     | NULL    |                |

The query is working fine. However, I would like to replace the QUERY with a stored procedure - a function would take three (3) arguments: start_date, end_date and a boolean flag called full.

I would like the full to be interpreted in a the following way: - if full is set to false, return the same results query returns now; - if full is set to true, return a row for each entry in the products table with quantity, price and average price returned as 0, if where fails merged with the query results - a row for each product, whether where were orders in the set period or not.

I was thinking about making a temporary table, then running an update on it and dumping the table after the data has been returned? What would be the correct way to approach this?

Thank you

Upvotes: 1

Views: 78

Answers (1)

suresubs
suresubs

Reputation: 144

Add a UNION to this query and have it do an LEFT OUTER JOIN from Products to Orders table and in the WHERE clause check for full = true and only look for rows with Order.id is NULL. Union would only bring rows when full = true. Prepare data in SELECT as you specified.

Upvotes: 1

Related Questions