2012-03-16 32 views
0

我有3连接的查询:缩短连接查询

SELECT t1.email, t2.firstname, t2.lastname, t4.value 
FROM t1 
left join t2 on t1.email = t2.email 
Inner join t3 on t2.entity_id = t3.order_id 
Inner join t4 on t3.product_id = t4.entity_id 
WHERE t4.attribute_id = 126 

我想我的服务器就不能让它:) - >时间已经不多了,从而出现错误!

非常感谢

表structur:

T1: 电子邮件(其然后在t2中是相同的)

T2: 电子邮件名姓订单ID(这被称为实体ID在T3 )

T3: ENTITYID产品ID(其被称为在t4的实体ID)

T4: entityid attributeid值

+1

你为什么这么认为? – Devart 2012-03-16 15:48:22

+0

这是什么问题? – 2012-03-16 15:48:36

+1

你可以发布你的表结构吗? – 2012-03-16 15:48:36

回答

1

除非t2直接连接到t4,否则没有办法。

另外,你需要t1和t2之间的左连接吗?

+0

他们与给定的词链接。左边的加入是因为t1中的人比t2中的更多,我需要所有人。 – user1228353 2012-03-16 16:03:07

+0

看,如果你外连接t1到t2,这意味着如果在t2中碰巧没有匹配,就不会从t1中丢失任何东西。所以在t2中可能有NULL行。然后你内部连接t2到t3。这没有意义,因为t2中的任何空行都不会匹配t3中的行。 – 2012-03-16 16:16:00

0

由于@Sachin已经指出,你不能“缩短”这个查询,除非t2链接t4而不需要与t3的比较。但是,为了加快查询速度,您应该在加入条件中引用的某些或所有列上有索引(即t1.email,t2.email,t2.entity_id等)。

在这些列的每一列上都有一个索引可以使您更快地查询SELECT查询,但它会减慢您的INSERTUPDATE查询的速度。所以如果你的SELECT比你INSERTUPDATE更频繁,那么你肯定应该使用索引。如果不是,请尝试在明智的地方制作索引(例如INSERTUPDATE语句的运行频率较低,但仍然有很多行)。

对于进一步澄清,请访问以下链接:

More information on how indexes work

Syntax for creating indexes

0

尝试查询是这样的:

SELECT t1.email, t2.firstname, t2.lastname, t4.value 
FROM t4 
INNER JOIN t3 ON t3.product_id = t4.entity_id 
INNER JOIN t2 ON t2.entity_id = t3.order_id 
INNER JOIN t1 ON t1.email = t2.email 
WHERE t4.attribute_id = 126  

它基本上是你的查询,但 “倒退”。您的原始方式是,您的DBMS必须尝试加入t2以获取t1中的所有记录,然后在t2中找到的所有记录加入t3,然后它甚至可以尝试解决您的WHERE子句。

我的方法是,您找到t4的所有记录,其中attribute_id = 126首先尝试连接其他表。它应该快得多。然后,您应该能够通过确保所涉及的表格中存在适当的索引来加快速度。您可以将关键字EXPLAIN预先添加到查询中,以查看DBMS如何尝试在查询中查找数据。