MySQL 逻辑帮助

标签 mysql e-commerce

我有以下查询,效果很好。我有 2 个问题......

1) 我可以删除子查询上 order 的内部联接并将其重新绑定(bind)到主查询中吗?

2) 我需要将返回因素纳入所有生成的值中。每件商品的价格仅存储在 order_product 中。我的表结构如下...

订单

id  |  account_id  |  price  |  tax  |  shipping_price

订单产品

order_id  |  product_id  |  vehicle_id  |  quantity  |  price

我需要系统支持每个订单多个 RMA...

订单返回

id  |  status_id  |  order_id  |  account_id  |  timestamp

order_return_product

return_id  |  reason_id  |  product_id  |  vehicle_id  |  note  |  quantity

此查询生成销售统计信息,我需要它不考虑已退回的商品....

SELECT
                    SUM(price+shipping_price) AS total_sales,
                    COUNT(id) AS total_orders,
                    AVG(price+shipping_price) AS order_total_average,
                    (SELECT
                            SUM(quantity)
                        FROM `order_product`
                        INNER JOIN `order` ON (
                            `order`.id = order_product.order_id AND
                            `order`.created >= '.$startTimestamp.' AND
                            `order`.created <= '.$endTimestamp.' AND
                            `order`.type_id = '.$type->getId().' AND
                            `order`.fraud = 0
                        )
                    ) AS total_units,
                    SUM(price+shipping_price)/'.$dateDifference['total']['days'].' AS daily_average
                FROM `order`
                WHERE created >= '.$startTimestamp.' AND
                created <= '.$endTimestamp.' AND
                fraud = 0 AND
                type_id = '.$type->getId().'

最佳答案

我不太明白你为什么形成内部联接;您已经在查询 ORDER 表,因此可以引用其中的当前行。也许以下内容可以?

SELECT
    SUM(price+shipping_price) AS total_sales,
    COUNT(id) AS total_orders,
    AVG(price+shipping_price) AS order_total_average,
    (SELECT
         SUM(quantity)
         FROM `order_product`
         WHERE `order`.id = order_product.order_id) AS total_units,
    SUM(price+shipping_price)/'.$dateDifference['total']['days'].' AS daily_average
FROM `order`
WHERE created >= '.$startTimestamp.' AND
      created <= '.$endTimestamp.'   AND
      fraud    = 0 AND
      type_id  = '.$type->getId().'

编辑:好点,我忽略了这一点。我建议添加一个子查询来查找返回的总计,并在 Total_units 计算中减去该总计,也许按照以下方式...

SELECT
SUM(price+shipping_price) AS total_sales,
COUNT(id) AS total_orders,
AVG(price+shipping_price) AS order_total_average,
((SELECT SUM(quantity)
      FROM `order_product`
      WHERE `order`.id = order_product.order_id) -
    (SELECT SUM (quantity)
         FROM order_return, order_return_product
         WHERE order_return.order_id = order.order_id AND
               order_return.id       = order_return_products.return_id))
   AS total_units,
SUM(price+shipping_price)/'.$dateDifference['total']['days'].' AS daily_average
FROM `order`
WHERE created    >= '.$startTimestamp.' AND
      created    <= '.$endTimestamp.'   AND
      fraud       = 0                   AND
      type_id  = '.$type->getId().'

关于MySQL 逻辑帮助,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3144129/

相关文章:

php - 如何选择每个产品的所有类别并在每个产品的一行中返回?

java - 连接池上的 MySql 连接无法恢复

mysql - 从一个非常大的表中删除多条记录(查询需要永远)

e-commerce - 在 Prestashop 中上传模块时文件太大(限制为 2097152 字节)

google-analytics - Google Analytics(分析)电子商务跟踪均显示为“直接/无”

java - @AdminPresentation在broadleafCommerce中有什么用

sql - Mysql:查询以使用仲裁器查找具有最大值的行

php - Doctrine DBAL 对存储过程的支持

mysql - 如何加快产品搜索查询速度

database-design - 网上商店实现 : Status for Orders?