2010-03-16 136 views
0

選擇我有兩個MySQL表,狀態​​和反式:MySQL的 - 優化跨兩個鏈接表

美國(200,000項)看起​​來像:

id (INT) - also the primary key 
energy (DOUBLE) 
[other stuff] 

反式(1400萬個)的樣子:

i (INT) - a foreign key referencing states.id 
j (INT) - a foreign key referencing states.id 
A (DOUBLE) 

我想用trans.A> 30.(比方說)來搜索trans中的所有條目,然後從每個匹配條目引用的(唯一)狀態中返回能量條目。所以我做了兩個中間表:

CREATE TABLE ij SELECT i,j FROM trans WHERE A>30.; 
CREATE TABLE temp SELECT DISTINCT i FROM ij UNION SELECT DISTINCT j FROM ij; 
SELECT energy from states,temp WHERE id=temp.i; 

這似乎工作,但有沒有辦法做到沒有中間表?當我試圖從反式直創建一個命令臨時表:

CREATE TABLE temp SELECT DISTINCT i FROM trans WHERE A>30. UNION SELECT DISTINCT j FROM trans WHERE A>30.; 

花了更長的(大概是因爲它不得不尋找大跨表兩次我是新來的MySQL,我可以」。不像是會找到一個等效的問題和答案在那裏的interwebs。 非常感謝, 基督教

回答

0

這應該做的伎倆,我在SQL Server 2008中測試過,所以希望它在MySQL工作過。

select energy from states 
where id in 
(
    select distinct i from trans where a > 30 
    union 
    select distinct j from trans where a > 30 
) 
+0

謝謝對於你的回覆,Axarydax,但這不是我所需要的:我想要列出trans.i和trans.j聯合中的每個獨特(不同的)條目,使得trans.A> 30,在這個列表中的每個id,我想要它的state.energy值。 用你的方法,我只會得到與trans.j相匹配的那些id,並且我會在該列表中得到重複。 感謝您的幫助, Christian – xnx

+0

已更新的原文 – Axarydax

+0

再次感謝 - 我可以看到這將如何工作在一行。 但是,當我嘗試它時,命令需要很長時間才能執行(10分鐘,等待...),而使用中間表則需要不到10秒。 你知道是否有辦法在MySQL中優化你的命令嗎? – xnx

0

好的。 ..有一點從Axarydax和其他人的幫助下,我用的是(本質上等價)的命令:

SELECT energy FROM states, 
(SELECT i FROM trans where A>30. UNION SELECT j i FROM trans WHERE A>30.) temp 
WHERE states.id=temp.i; 

其速度不夠快,如果我有一個指標適用於I,J和A.