Mysql 什么是可选的连接查询
表:项目 表:订单 表:项目订单 要提取的内容: 对于每个订购者id、订购数量、总数量、总价格 目前的做法: 使用相关子查询 是否可以通过将项目订单与订单连接来解决此问题?如果是,如何进行 另一种方法我想- 选择从命令 选择从商品订单 在应用层中按要求组合和格式化Mysql 什么是可选的连接查询,mysql,Mysql,表:项目 表:订单 表:项目订单 要提取的内容: 对于每个订购者id、订购数量、总数量、总价格 目前的做法: 使用相关子查询 是否可以通过将项目订单与订单连接来解决此问题?如果是,如何进行 另一种方法我想- 选择从命令 选择从商品订单 在应用层中按要求组合和格式化 您可以假设,订单和项目订单表将变得更大,哪种解决方案更好?由于订单与项目订单之间存在一对多关系,因此在子查询中执行聚合并连接到派生表更容易: SELECT o.orderer_id, COUNT(o.id) AS num
您可以假设,订单和项目订单表将变得更大,哪种解决方案更好?由于订单与项目订单之间存在一对多关系,因此在子查询中执行聚合并连接到派生表更容易:
SELECT o.orderer_id,
COUNT(o.id) AS number_of_order,
SUM(io.quantity) AS total_quantity,
SUM(o.price) AS total_price
FROM orders o
JOIN (SELECT order_id, SUM(quantity) AS quantity
FROM item_order
GROUP BY order_id) io ON io.order_id = o.id
GROUP BY o.orderer_id
输出:
orderer_id number_of_order total_quantity total_price
53 2 9 250
54 2 4 440
我希望这比相关子查询更快,因为该查询必须对orders表中的每一行执行,而派生表的查询虽然更复杂,但只执行一次。我还希望这比执行两个查询并在应用程序层进行组合的选项更快。请检查此选项
模式MySQL v8.0
问题1
这似乎是一个奇怪的设计,其中item_order不知道单价,items不知道item价格。因此我们不能使用内部联接,对吗?它不是完整的表结构。每个表都有几列。在这里,我只添加了thoseat minimum,这将有助于得到答案。如果表的大小增加了怎么办?@MASh我希望这会比其他选择更快。但归根结底,最好以实际数据为基准。您可以比较这两个查询,如果在应用程序层执行的工作更快,我会非常惊讶。@MASh它不仅仅是大小。这也是“密度”。“稀疏”数据集的性能可能不同于“密集”数据集。到目前为止,这是我的最佳答案。接受你的回答。
+----+--------+---------+----------+
| id |order_id| item_id | quantity |
+----+--------+---------+----------+
| 1 | 1 | 1 | 2 |
| 2 | 1 | 2 | 3 |
| 3 | 2 | 2 | 2 |
| 4 | 3 | 1 | 1 |
| 5 | 3 | 2 | 1 |
| 6 | 4 | 1 | 2 |
| 7 | 4 | 2 | 2 |
+----+--------+---------+----------+
+---------+-----------------+----------------+-------------+
| orderer | number_of_order | total_quantity | total_price |
+---------+-----------------+----------------+-------------+
| 53 | 2 | 9 | 250 |
| 54 | 2 | 4 | 440 |
+---------+-----------------+----------------+-------------+
select orderer_id as orderer,
count(*) as number_of_order,
sum(select quantity from item_order where item_order.order_id = orders.id) as total_quantity,
sum(price) as total_price
from orders
order by orderer_id
SELECT o.orderer_id,
COUNT(o.id) AS number_of_order,
SUM(io.quantity) AS total_quantity,
SUM(o.price) AS total_price
FROM orders o
JOIN (SELECT order_id, SUM(quantity) AS quantity
FROM item_order
GROUP BY order_id) io ON io.order_id = o.id
GROUP BY o.orderer_id
orderer_id number_of_order total_quantity total_price
53 2 9 250
54 2 4 440
CREATE TABLE orders (
`id` INTEGER,
`price` INTEGER,
`orderer_id` INTEGER
);
INSERT INTO orders
(`id`, `price`, `orderer_id`)
VALUES
('1', '100', '53'),
('2', '240', '54'),
('3', '200', '54'),
('4', '150', '53');
CREATE TABLE item_order (
`id` INTEGER,
`order_id` INTEGER,
`item_id` INTEGER,
`quantity` INTEGER
);
INSERT INTO item_order
(`id`, `order_id`, `item_id`, `quantity`)
VALUES
('1', '1', '1', '2'),
('2', '1', '2', '3'),
('3', '2', '2', '2'),
('4', '3', '1', '1'),
('5', '3', '2', '1'),
('6', '4', '1', '2'),
('7', '4', '2', '2');
with cte0 as
(
select
orderer_id orderer,
count(distinct o.id) number_of_order,
sum(io.quantity) total_quantity
from orders o
inner join item_order io
on io.order_id = o.id
group by orderer_id
), cte1 as
(
select
orderer_id,
sum(price) total_price
from orders
group by orderer_id
)
select orderer, number_of_order, total_quantity, total_price from cte0
inner join cte1
on cte0.orderer = cte1.orderer_id;
| orderer | number_of_order | total_quantity | total_price |
| ------- | --------------- | -------------- | ----------- |
| 53 | 2 | 9 | 250 |
| 54 | 2 | 4 | 440 |