我有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
我认为我的服务器无法做到:) - >时间不多了所以发生错误!
非常感谢
表结构:
T1: 电子邮件(与t2相同)
T2: email firstname lastname orderid(在t3中称为实体id)
T3: entityid产品ID(在t4中称为实体ID)
T4: entityid属性值
答案 0 :(得分:1)
除非t2直接链接到t4,否则没办法。
另外,你需要在t1和t2之间进行左连接吗?
答案 1 :(得分:0)
正如@Sachin所述,除非t2
将直接链接到t4
,否则您无法“缩短”此查询,而无需与t3
进行比较。但是,为了加快查询速度,您应该在连接条件中引用的部分或全部列上具有索引(即t1.email
,t2.email
,t2.entity_id
等。< / p>
在每个列上都有一个索引可以为您提供更快的SELECT
次查询,但会降低您的INSERT
和UPDATE
次查询速度。因此,如果SELECT
比INSERT
或UPDATE
更频繁,那么您肯定应该使用索引。如果没有,请尝试在明智的位置创建索引(具有INSERT
或UPDATE
语句的表运行频率较低,但仍然有很多行。)
有关进一步说明,请参阅以下链接:
答案 2 :(得分: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中的所有记录,然后加入t3
以获取在t2中找到的所有记录,甚至可以尝试解决您的WHERE
子句。
我的方式是,您首先在t4
找到attribute_id = 126
的所有记录,然后尝试加入其他表格。它应该快得多。然后,您应该通过确保所涉及的表上存在正确的索引来进一步加快速度。您可以在查询前添加关键字EXPLAIN
,以查看DBMS如何尝试在查询中搜索数据。