2011-08-29 130 views
2

在我的MySQL数据库中,我有两个表:'orders'和'orders_lines'。订单包含有关客户的信息,订单日期等。 Orders_lines包含有关产品的数据,如product_id,价格,数量,税率等。MySQL查询使服务器崩溃?

我目前正在建立一个搜索页面,我想要返回包含特定产品的订单。例如,我想用的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行。

任何建议为什么我的数据库崩溃,如何更改查询以使其正常工作或如何实现显示包含某个产品的订单的目标,欢迎您!

亲切的问候,

的Martijn

+1

你有什么指标在桌子上?你能发表表格的定义吗? –

+0

答案是否可以,'order_lines.order_id'无效? –

+0

但如何查询放下一个MySQL服务器自己?使所有其他查询/连接变慢?为什么 – Miguel

回答

1

我不知道这是你需要什么,反正试试:

SELECT DISTINCT o.* FROM orders o 
INNER JOIN order_lines ol 
ON o.order_id = ol.order_id 
WHERE ol.product_id = 2 
+0

你错过了一个'DISTINCT'。 –

+0

@Daniel:我认为在order_lines中你不能有多于一行product_id = 2 ...应该有一个数量列...我错了吗?无论如何,感谢您的建议! – Marco

+0

这是一个可能正确或不可能的假设。如果同一产品的每个订单有多个order_lines,那么如果不同,则相应的订单将被多次返回。 –

1

据我所知道的是内部连接(又名naturual加入)最好在这种情况下的路要走。 '在哪里..在..往往是一个昂贵的操作。

SELECT DISTINCT o.* FROM orders o 
INNER JOIN orders_lines ol ON o.order_id = ol.order_id 
WHERE ol.product_id = 2 
+0

类似的回答很好,但在同一时间完全一样!你想让我删除我的吗? :) – Marco

+0

您错过了'DISTINCT'。 –

+0

@Daniel,我的确是,tx – Peter

2

查询可以用JOIN(和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

+0

+1解释。 – Johan