2012-03-16 34 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如何嘗試在查詢中查找數據。