首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MySQL存储过程体系结构

MySQL存储过程体系结构
EN

Stack Overflow用户
提问于 2018-01-03 18:51:58
回答 1查看 65关注 0票数 1

我正在编写一段针对MySQL运行查询的代码。语法如下:

代码语言:javascript
复制
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`

我的order表:

代码语言:javascript
复制
| 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              |                |

我的product表:

代码语言:javascript
复制
| 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    |                |

查询运行正常。然而,我想用一个存储过程代替查询--一个函数需要三(3)个参数:start_dateend_date和一个名为full的布尔标志。

我希望以以下方式解释full:-如果full设置为false,则返回查询返回的相同结果;-如果full设置为true,则为products表中的每个条目返回一行,其中数量、价格和平均价格返回为0,如果where失败,则与查询结果合并-为每个产品返回一行,无论订单是否在设置的时间段内。

我在考虑创建一个临时表,然后对其运行更新,并在数据返回后转储该表?解决这个问题的正确方法是什么?

谢谢

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-01-03 20:08:16

向这个查询添加一个UNION,并让它执行从Products到Orders表的左外连接,并在WHERE子句中检查full = true,只查找Order.id为NULL的行。仅当full = true时,Union才会带来行。按照您指定的方式在SELECT中准备数据。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48075907

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档