MySQL将2个表中的数据合并到第3个表中

时间:2013-03-28 13:55:56

标签: mysql sql join sql-insert

我目前有两张桌子:

CrawlData
id (autoincrement), Source, Destination, and some more columns

Nodes
id (autoincrement), URL

节点表包含来自抓取数据

的不同来源值

现在我希望有一个表是一种查找表,其中包含来自节点的ID,而不是 CrawlData

中源和目标中的文本

我可以使用在URL = Source和URL = Destination上使用Join的Select查询来获取所有ID,但不知道如何组合这些ID,然后将它们放入新表中 Edges 有2列:

  • SourceNode(=来自Nodes的ID,其中CrawlData.Source = URL)
  • DestinationNode(=来自节点的ID,其中CrawlData.Destination = URL)

2 个答案:

答案 0 :(得分:2)

您可以使用INSERT声明SELECT INSERT INTO...SELECT语句返回的记录。

INSERT INTO Edges(SourceNode, DestinationNode)
SELECT  b.ID SourceNode,
        c.ID DestinationNode
FROM    CrawlData a
        INNER JOIN Nodes b
            ON a.Source = b.URL
        INNER JOIN Nodes c
            ON a.Destination = c.URL

要进一步了解联接,请访问以下链接:

为了加快执行速度,请执行以下语句以在列上添加INDEX以避免FULL TABLE SCAN,如果在大型RDBMS上执行此操作可能会很慢。

ALTER TABLE Nodes ADD INDEX (URL);

如果在Source上出现DestinationNodes.URL列的所有值,请将这些列声明为外键,

ALTER TABLE CrawlData 
      ADD CONSTRAINT cd_fk1 FOREIGN KEY (Source) REFERENCES Nodes(URL)
ALTER TABLE CrawlData 
      ADD CONSTRAINT cd_fk2 FOREIGN KEY (Destination) REFERENCES Nodes(URL)

否则,在它们上添加正常索引

ALTER TABLE CrawlData ADD INDEX (Source);
ALTER TABLE CrawlData ADD INDEX (Destination);

答案 1 :(得分:1)

您可以两次加入Nodes表。一次,使用Source加入URLK。下次使用目的地。

从概念上讲,它就像使用Nodes表的两个副本,每个副本都有不同的名称(比如“S”和“D”)。你得到:

select S.ID As SOURCE_ID, D.ID As DEST_ID
from CrawlData
join Nodes S on Source = S.URL
join Nodes D on Destination = D.URL