Mysql 从两个表中获取 SUM 和 COUNT 值

Mysql get SUM and COUNT value from two tables

这是我的 table

table 1: 订单

id  total order_date
1   200    2016-04-22
2   300    2016-04-22

table 2: order_products

 id  order product_id qty
  1    1       1       2
  2    1       2       1
  3    2       2       2
  4    2       1       2

我的结果应该是

tot_order total_amount  prd_qty
 2      500             7 

我的查询是

    SELECT COUNT(ddo.id) AS tot_order, 
           SUM(ddo.total) AS total_amount, 
           (SELECT SUM(dop.qty) 
            FROM  order_products dop 
            WHERE dop.order=ddo.id) AS prd_qty  
    FROM orders ddo 
    WHERE DATE(ddo.`order_date`) BETWEEN '2016-04-22' AND '2016-04-22'

我可以得到total_order和total_amount,但是如何得到prd_qty

谢谢

也许您缺少 GROUP BY 子句

(SELECT SUM(dop.qty) FROM  order_products dop WHERE dop.order=ddo.id GROUP BY dop.order)

您应该使用子查询来计算 prd_qty:

SELECT SUM(dop.qty) as prd_qty,  dop.order 
FROM  order_products dop 
GROUP BY dop.order

每个订单计数 prd_qty。
完整查询:

SELECT COUNT(ddo.id) AS tot_order, 
       SUM(ddo.total) AS total_amount, 
       sum(op.prd_qty) as prd_qty
FROM   orders ddo 
       JOIN 
       (
            SELECT SUM(dop.qty) as prd_qty,  dop.order 
            FROM  order_products dop 
            GROUP BY dop.order
       ) as op ON (op.order = ddo.id)
WHERE  DATE(ddo.`order_date`) BETWEEN '2016-04-22' AND '2016-04-22'

此查询适合您。

SELECT COUNT(od.`id`) AS tot_order, SUM(od.`total`) AS total_amount, tablea.prd_qty
FROM orders od JOIN (
                SELECT SUM(op.`prd_qty`) AS prd_qty
                FROM orders od INNER JOIN order_products op
                ON od.`id`=op.`order`
                WHERE DATE(od.`order_date`) BETWEEN '2016-04-22' AND '2016-04-22' 
) tablea
WHERE DATE(od.`order_date`) BETWEEN '2016-04-22' AND '2016-04-22'

要获得 prd_qty,您必须 运行 我在 join 之后的小括号中添加的子查询。

看起来你想把 order_products 加起来变成 orders 然后加起来结果。

我会在查询中遵循这个概念:

SELECT COUNT(*) tot_order,
       SUM(os.total) total_amount,
       SUM(os.o_prd_qty) prd_qty
  FROM (       
    SELECT o.id,
           o.total,
           SUM(op.qty) o_prd_qty
      FROM orders o
      JOIN order_products op
        ON op.order = o.id
     WHERE o.order_date >= :start_date
       AND o.order_date < :end_date + INTERVAL 1 DAY
  GROUP BY o.id
       ) os

如果你想要单独的 orders 和他们的 prd_qty 只是 运行 内部查询。

我还修复了您的日期逻辑,以便优化器可以使用 order_date 上的索引。通常,如果将一列包装在比较的一侧的函数中,则该列上的任何索引都不可用。

附带说明一下,我会仔细研究一下您的命名约定。每个人都有自己的喜好,但你应该与这些问题保持一致:

  • 缩写? - tot, total, prd, product, qty
  • 附加 _id 外键? - order_products.order, order_products.product_id
  • 在列中包含 table 名称? - orders.totalorders.order_date

遵循约定可以使您的数据库更易于导航和使用。否则在编写每个查询时都会返回到模式!

就我个人而言,我通常不会缩写,请在列中附加 _id 并且不要包含 table 名称。

获得答案的最简单的查询是,这就像一把刀穿过黄油。

但是,如果为列 orders(id) 创建索引会更漂亮。如果它已经是一个主键列索引将不需要 只有当您相信您的数据数量会增加时才会建立索引

select count(o.id) as tot_order ,
sum(o.total) as total_amount,
(select sum(p.qty) from orders o join order_product p on o.id=p.order) as prd_qty     
from orders o;

This should work fine for you.

select sum(order_id) orders, sum(total) total, sum(qty) prd_qty
from (select count(o.id) order_id, sum(o.total) total,
(select sum(qty) from order_products op where o.id = op.`order`) qty
from orders o group by o.id) x;

相当简单。