2016-07-05 55 views
1

我正在研究一系列SQL(MySQL)查詢,以將站點從Drupal 6遷移到WordPress(當前爲4.5.3)。我在我的筆記本電腦上運行本地主機上的所有查詢(所以它只是將數據從一個數據庫移動到另一個數據庫),所以此時性能不是問題。SQL將作者/故事關係從Drupal遷移到WordPress

我無法遷移作者節點和故事節點之間的關係。在Drupal中,它的工作原理如下:

  • 有一篇文章節點。爲此目的,這不是習慣。這些有5萬多個。
  • 作者有一種自定義內容類型(因爲很多作者實際上不是Drupal用戶,也因爲它允許我們爲作者頁面提供更多自定義顯示)。有〜2000這些。
  • 有一個content_field_op_author表,其中包含以下列:vid(對於修訂版),nid(對於文章節點)和field_op_author_nid(對於作者節點)。

我嘗試運行此查詢,瞭解有多少雙有:

SELECT COUNT(*) FROM content_field_op_author GROUP BY nid; 

這導致了57898行(這似乎真實的我)。

在WordPress中,設置是這樣的:

  • wp_posts具有標準帖子內容類型。所有文章都已成功導入,並且主ID與Drupal中的節點行相匹配。
  • 來賓作者有一個自定義文章類型(由插件運行)。所有〜2000都已成功導入,並且主ID也與Drupal中的節點行匹配。
  • 每位訪客作者也存在一行wp_termswp_term_taxonomy。我創建了一個名爲user_node_id_old的專欄,用於保留用戶帖子ID的節點ID。我不確定這是否有必要,但確實存在。

我一直無法使用一些不同的查詢嘗試在wp_term_relationships中創建正確的行。

查詢我已經試過:

INSERT IGNORE INTO `wordpress`.wp_term_relationships(object_id, term_taxonomy_id) 
    SELECT nid as object_id, tax.term_taxonomy_id as term_taxonomy_id 
    FROM `drupal`.content_field_op_author author 
    INNER JOIN `wordpress`.wp_terms t ON t.user_node_id_old = author.field_op_author_nid 
    INNER JOIN `wordpress`.wp_term_taxonomy tax ON t.term_id = tax.term_id 
    INNER JOIN `wordpress`.wp_posts p ON author.nid = p.Id 
    WHERE field_op_author_nid IS NOT NULL 
    GROUP BY object_id 
; 

這導致52754行被添加到wp_term_relationships這似乎是一個奇怪的差距縮小到了我。

我跑這個查詢試圖找到在我的Drupal數據庫中的行而不是在WordPress:

SELECT DISTINCT `wordpress`.p.ID as wordpress_post_id, `wordpress`.t.name as wordpress_author_name, n.nid as drupal_id, au.title as drupal_author_name 
FROM `wordpress`.wp_posts p 
INNER JOIN `wordpress`.wp_term_relationships r ON r.object_id = p.ID 
INNER JOIN `wordpress`.wp_term_taxonomy tax ON tax.term_taxonomy_id = r.term_taxonomy_id 
INNER JOIN `wordpress`.wp_terms t ON t.term_id = tax.term_id 
LEFT OUTER JOIN `drupal`.node n ON p.ID = n.nid 
LEFT OUTER JOIN `drupal`.content_field_op_author a ON n.nid = a.nid 
LEFT OUTER JOIN `drupal`.node au ON a.field_op_author_nid = au.nid 
WHERE tax.taxonomy = 'author' 
AND `wordpress`.t.name != au.title 
; 

這導致333行。

我想這其中還有:

INSERT IGNORE INTO `wordpress`.wp_term_relationships(object_id, term_taxonomy_id, user_node_id_old) 
    SELECT nid as object_id, 0 as term_taxonomy_id, field_op_author_nid as user_node_id_old 
    FROM `drupal`.content_field_op_author 
    WHERE field_op_author_nid IS NOT NULL 
    GROUP BY CONCAT(nid, field_op_author_nid) 
; 

這導致331行。我認爲這個查詢對於實際遷移的內容要準確得多,但它仍然沒有得到我認爲我需要的數字匹配。它也似乎與總行數的差異無關。

回答

0

我確定至少部分原因是我的不匹配是Drupal以任何順序存儲故事/作者對。它不是按字母順序排列的,或者是作者的節點ID。我在嘗試在插入到WordPress之前對插入進行排序的許多不同方式後發現了這一點。

我試過這個查詢,結果爲0行。這是理所應當的,但我還是有點緊張,這意味着一切都已成功:

SELECT DISTINCT `wordpress`.p.ID as wordpress_post_id, `wordpress`.t.name as wordpress_author_name, n.nid as drupal_id, au.title as drupal_author_name 
FROM `wordpress`.wp_posts p 
INNER JOIN `wordpress`.wp_term_relationships r ON r.object_id = p.ID 
INNER JOIN `wordpress`.wp_term_taxonomy tax ON tax.term_taxonomy_id = r.term_taxonomy_id 
INNER JOIN `wordpress`.wp_terms t ON t.term_id = tax.term_id 
LEFT OUTER JOIN `drupal`.node n ON p.ID = n.nid 
LEFT OUTER JOIN `drupal`.content_field_op_author a ON n.nid = a.nid 
LEFT OUTER JOIN `drupal`.node au ON t.name = au.title 
WHERE tax.taxonomy = 'author' 
AND `wordpress`.t.name != au.title 
; 

這個查詢 - 我認爲 - 沒有一個對作者的名字加入,而不是說到的ID與之匹配,即使訂單被翻轉,也應該允許匹配。這個翻轉的順序是我一直注意到前面的查詢 - 如果一個故事有多個作者,他們的順序將在兩個系統之間翻轉。