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.total
、orders.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;
相当简单。
这是我的 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.total
、orders.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;
相当简单。