2012-03-30 3 views
2

Ich mache gerade eine Migration eines Drupal-Blogs zu Wordpress in einer MySQL-Datenbank.mySQL-Befehl zum Zusammenfassen von Übereinstimmungen (Drupal zur Wordpress-Migration)

Ich habe alle meine Posts importiert, und ich versuche derzeit, alle meine Drupal Post-Bilder (in einem story_image-Widget) zu meinen Wordpress-Posts zu verknüpfen.

Wenn ich diese Abfrage ausführen:

UPDATE IGNORE wordpress.wp_posts p, drupal.content_field_story_image i, drupal.files f 
SET p.post_content = 
CONCAT(
    f.filename, ' ', p.post_content 
) 
WHERE p.ID = i.nid 
AND i.field_story_image_fid = f.fid 
AND (
    f.filename LIKE '%.jpg' 
    OR f.filename LIKE '%.jpeg' 
    OR f.filename LIKE '%.png' 
    OR f.filename LIKE '%.gif' 
); 

alle meine Wordpress Beiträge vorangestellt sind mit genau einem ihrer Bilder, obwohl ich es möchte eine Liste aller von ihnen vorangestellt wird.

Ich bin ein bisschen rostig mit SQL-Sachen, und würde gerne wissen, was die Anweisung wäre, den Dateinamen jedes Mal anzuhängen, wenn es eine richtige Übereinstimmung gibt, und nicht nur einmal.

Hier ist eine vereinfachte Version der Datenbanken und Tabellen I mit

DATABASE: wordpress 


TABLE: wp_posts 

id | post_content 
------------------ 
1 | hello 



DATABASE: drupal 


TABLE: content_field_story_image 

nid | field_story_image_fid 
---------------------------- 
1 | 18 
1 | 19 


TABLE: files 

fid | filename 
--------------- 
18 | alpha.jpeg 
19 | beta.jpeg 

Erwartete POST_CONTENT nach dem Update arbeite:

beta.jpeg alpha.jpeg hello 

Actual POST_CONTENT nach Update:

alpha.jpeg hello 

I wahrscheinlich sollte es nicht einmal in einem UPDATE ... SET sein, um damit zu beginnen. Vielen Dank im Voraus für Anregungen.

UPDATES:

Dank der Antworten gegeben Ich habe mit GROUP_CONCAT

herumgespielt worden habe ich jetzt diese Abfrage, die eine Liste der Bilder für jede

SELECT GROUP_CONCAT(drupal.files.filename SEPARATOR ' ') 
       FROM wordpress.wp_posts , drupal.content_field_story_image, drupal.files 
       WHERE wordpress.wp_posts.ID = drupal.content_field_story_image.vid 
       AND drupal.content_field_story_image.field_story_image_fid = drupal.files.fid 
       AND (
        drupal.files.filename LIKE '%.jpg' 
        OR drupal.files.filename LIKE '%.jpeg' 
        OR drupal.files.filename LIKE '%.png' 
        OR drupal.files.filename LIKE '%.gif' 
       ) 
       GROUP BY wordpress.wp_posts.ID; 

Post zurück Jetzt nur nach einer Möglichkeit suchend, diese Liste in jeden Wordpress-Beitrag einzufügen.

+0

Ich habe auch dies mit einfach „UPDATE“ statt „UPDATE ignore“ versucht, aber ohne Erfolg. –

Antwort

0

versuchen, die Group_concat, wie folgend:

UPDATE IGNORE wordpress.wp_posts p, drupal.content_field_story_image i, drupal.files f 
SET p.post_content = 
CONCAT(
    group_concat(f.filename SEPARATOR ' '), ' ', p.post_content 
) 
WHERE p.ID = i.nid 
AND i.field_story_image_fid = f.fid 
AND (
    f.filename LIKE '%.jpg' 
    OR f.filename LIKE '%.jpeg' 
    OR f.filename LIKE '%.png' 
    OR f.filename LIKE '%.gif' 
); 
+0

danke für die schnelle antwort! Nach dem Ausführen der Abfrage bekomme ich "# 1111 - Ungültige Verwendung der Gruppenfunktion" –

+0

Sie müssen eine 'Group By' -Klausel in Ihrer Abfrage am Ende verwenden, versuchen Sie mit' group by p.post_content' – Vikram

+0

hmm immer noch nicht funktioniert. Ich denke, ich kann group_concat in einem SET nicht so verwenden? vielleicht? –

Verwandte Themen