2013-03-28 29 views
1

我目前有2個表:的MySQL從2個表的數據組合到第3臺

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

Nodes 
id (autoincrement), URL 

節點表包含了不同來源值從CrawlData

現在我想有一個表是一種查找表,其中包含來自節點的ID而不是源和目標中的文本來自CrawlData

我可以在URL = Source和URL = Destination上使用Join進行Select查詢,但不知道如何合併這些,然後將它們放在新表中Edge有2列:

  • SourceNode(= ID從那裏CrawlData.Source = URL節點)
  • DestinationNode(= ID從節點,其中CrawlData.Destination = URL)

回答

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); 

如果碰巧的SourceDestination列中的所有值都存在於Nodes.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); 
+0

thx ..這似乎工作,雖然它肯定是一個緩慢的查詢。已經運行了30多分鐘,現在仍然很忙..... – Chrisvdberge

+0

這是因爲查詢正在執行全表掃描。你有沒有嘗試添加建議的索引? –

+0

我按照你的提示添加索引後,我取消了查詢並再次嘗試。儘管如此,仍然需要很長時間。 我想知道... 2不會與「WHERE a.Source = b.URL和a.destination = c.URL」相同嗎? – Chrisvdberge

1

添加普通索引您可以加入兩次Nodes表。一旦使用Source加入URLK。下次使用目的地。

從概念上講,它就像使用節點表的兩個副本一樣,每個副本都有不同的名稱(比如「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 
相關問題