MySQL - 优化两个链接表的选择

时间:2010-03-16 10:50:35

标签: mysql join union distinct key

我有两个MySQL表,状态​​和trans:

州(200,000个条目)看起来像:

id (INT) - also the primary key
energy (DOUBLE)
[other stuff]
trans(14,000,000个条目)看起来像:

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

我想用trans.A>搜索trans中的所有条目。 30.(比如说),然后从每个匹配条目引用的(唯一)状态返回能量条目。所以我用两个中间表做到了:

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;

这似乎有效,但有没有办法在没有中间表的情况下做到这一点?当我尝试使用单个命令直接从trans创建临时表时:

CREATE TABLE temp SELECT DISTINCT i FROM trans WHERE A>30. UNION SELECT DISTINCT j FROM trans WHERE A>30.;
花了更长的时间(大概是因为它必须两次搜索大型转换表。我是MySQL的新手,我似乎找不到相同的问题并在互联网上回答。 非常感谢, 基督教

2 个答案:

答案 0 :(得分: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   
)

答案 1 :(得分: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上有索引,它的工作速度足够快。