2013-03-10 100 views
-3

我们有一个名为productID的表,其中productID为主键。然后我们有一个名为productProcess的表,其中存储了productID和processID。所以现在我们要搜索productProcess表中没有实例的所有productID。目前,我们首先运行两个查询所有产品,其次是productProcess的productID,并选择不存在的产品ID。有没有其他的机制呢?Mysql查询效率

+4

我有这张表,我有那张表,但哪里的查询必须优化? – 2013-03-10 16:57:50

+2

是的。你有什么尝试? – SJuan76 2013-03-10 16:58:29

+1

我首先从tblProduct中选择productId。然后我尝试从tblProductProcess中选择不同的productID。然后我比较两者并选择那些productID在第二个查询中不存在。 – biz14 2013-03-10 17:03:25

回答

2

是的,有。使用LEFT JOIN

SELECT a.*  // this will get all columns from product table. 
FROM product a 
     LEFT JOIN productProcess b 
      ON a.productID = b.productID 
WHERE b.productID IS NULL 

为了进一步获得更多的知识有关加入,请访问以下链接:

另一个提示,使若快速呃是为表productProcess设置一个外键productID

+0

是的productID是外键,但我不明白为什么我们必须把b.productID是NULL? – biz14 2013-03-10 17:07:40

+0

哦,我明白了,请记住,我们正在使用'LEFT JOIN',它将返回左侧表中的所有记录。第二个表上没有匹配ID的记录在其他列上的值为null。为了演示:[>> CLICK_HERE <<](http://www.sqlfiddle.com/#!2/8b410/3) – 2013-03-10 17:10:24

+1

好吧我现在清楚了。 – biz14 2013-03-10 17:11:33

2

假设product.productID 不能为空

SELECT product.productID 
FROM product 
LEFT JOIN productProcess 
ON productProcess.productID = product.productID 
WHERE productProcess.productID IS NULL 

另一种选择是WHERE NOT EXIST

SELECT product.productID 
FROM product 
WHERE NOT EXISTS (
    SELECT productID FROM productProcess 
    WHERE productProcess.productID = product.productId 
) 
+0

这是更快的产生结果? – biz14 2013-03-10 17:06:14

+0

测试一下,这会告诉你。这两者在这里的工作大致相同,但它在不同的mysql服务器版本中会有一些偏差。 – Wrikken 2013-03-10 17:07:26

+0

好吧我会测试它,但我认为你必须交换这个ON productProcess.productID = product.productID – biz14 2013-03-10 17:12:18

1

您可以使用左连接。 如果您可以使用左连接,则结果将是所有与产品和产品流程有关的产品。

SELECT p.* 
FROM (product p LEFT JOIN productProcess pp ON a.productID = b.productID) 
WHERE pp.productID IS NULL