2

在我的 MySQL 数据库中,我有两个表:“orders”和“orders_lines”。订单包含有关客户、订单日期等的信息。Orders_lines 包含有关订购产品的数据,例如 product_id、价格、数量、税率等。

我目前正在构建一个搜索页面,我想在其中返回包含特定产品的订单。例如,我想返回 product_id 为 2 的所有订单。我想到了这样的查询:

SELECT * FROM orders WHERE order_id IN ( SELECT order_id FROM orders_lines WHERE product_id = 2 )

但是当我今天早上执行查询时,我不得不打电话给托管服务提供商来终止 MySQL 进程,因为它太重了。从来没有听说过,也不知道为什么,我现在很绝望。orders 表包含大约 30.000 行,orders_lines 表包含大约 38.000 行。

欢迎任何关于我的数据库崩溃、如何更改查询以使其正常工作或如何实现显示包含特定产品的订单的目标的建议!

亲切的问候,

马汀

4

3 回答 3

2

查询可以用JOIN(and GROUP BY) 重写:

SELECT o.* 
FROM orders o
  INNER JOIN order_lines ol
    ON o.order_id = ol.order_id
WHERE ol.product_id = 2
GROUP BY o.order_id

或者最好 - 因为你只想要orders表格中的结果 - 使用EXISTS

SELECT * 
FROM orders AS o
WHERE EXISTS  
      ( SELECT * 
        FROM orders_lines AS ol
        WHERE ol.product_id = 2 
          AND ol.order_id = o.order_id
      )

EXPLAIN但是在再次运行可能导致服务器故障的东西之前检查您的索引和索引。

于 2011-08-29T12:32:11.540 回答
1

据我所知,在这种情况下,内连接(又名自然连接)是最好的方法。'WHERE .. IN .. 往往是一项昂贵的操作。

SELECT DISTINCT o.* FROM orders o
INNER JOIN orders_lines ol ON  o.order_id = ol.order_id 
WHERE ol.product_id = 2
于 2011-08-29T11:53:31.297 回答
1

我不确定这是你需要的,无论如何尝试:

SELECT DISTINCT o.* FROM orders o
INNER JOIN order_lines ol
ON o.order_id = ol.order_id
WHERE ol.product_id = 2
于 2011-08-29T11:54:36.757 回答