Mysql 什么是可选的连接查询

Mysql 什么是可选的连接查询,mysql,Mysql,表:项目 表:订单 表:项目订单 要提取的内容: 对于每个订购者id、订购数量、总数量、总价格 目前的做法: 使用相关子查询 是否可以通过将项目订单与订单连接来解决此问题?如果是,如何进行 另一种方法我想- 选择从命令 选择从商品订单 在应用层中按要求组合和格式化 您可以假设,订单和项目订单表将变得更大,哪种解决方案更好?由于订单与项目订单之间存在一对多关系,因此在子查询中执行聚合并连接到派生表更容易: SELECT o.orderer_id, COUNT(o.id) AS num

表:项目

表:订单

表:项目订单

要提取的内容:

对于每个订购者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
我希望这比相关子查询更快,因为该查询必须对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         |