2010-03-16 137 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.