2016-09-18 40 views
0

我想根据一个表中的值是否落入另一个表中的区间来创建两个表之间的关系。一个表1是〜16000行:如何在MySQL中使用区间比较来创建表之间的关系?

name  | start  | end 
----------------------------------------- 
someName | startPosition | endPosition 

表2是〜2000万行:

id  | location 
-------------------------- 
someID | positionInteger 

每个ID落在恰好一个名字的间隔,但每个名称可以具有与其相关联的许多IDS 。

我想一个新的索引添加到表2,使之成为:

id  | location  | name 
--------------------------------- 
someID | positionInteger | someName 

我试着这样做:

ALTER TABLE table2 ADD INDEX name (name); 

有了一点蟒我可以得到所有的在数据库中,然后对于每个名称和间隔名称:

SELECT someID FROM table2 WHERE location >= startPosition AND location <= endPosition 

然后我可以通过将得到的ID和循环:

UPDATE table2 SET name = 'someName' WHERE id = 'someID' 

这种方法很有效,但速度很慢。有没有更有效的方式来使用MySQL并避免多个循环?

回答

0

加入表

SELECT t2.id, t2.location, t1.name 
FROM Table1 AS t1 
JOIN Table2 AS t2 ON t2.location BETWEEN t1.startPosition AND t1.endPosition 

你不应该添加索引表2,你应该添加一列:

ALTER TABLE Table2 ADD COLUMN name VARCHAR(32); -- Replace this with the actual size 

然后你就可以更新所有具有类似的行加盟:

UPDATE Table2 AS t2 
JOIN Table1 AS t1 ON t2.location BETWEEN t1.startPosition AND t1.endPosition 
SET t2.name = t1.name 
+0

谢谢。这个解决方案和我Putu Susila的解决方案都运行良好。我能够在更新后将索引添加到新列 – ttunstall

0

您可以使用LEFT JOIN

SELECT id,location,name FROM table2 as t2 
LEFT JOIN table1 as t1 
ON t2.location BETWEEN t1.`start` AND t1.`end`; 

更多细节http://sqlfiddle.com/#!9/721e5/1