2012-12-22 35 views
1

我在数据库从目标网站两个表,并要得到交行的缩略图。一个表格是wp_posts,另一个表格是wp_postmeta。标准WordPress的出口不包括精选图片,所以我打算自己做。 wp_posts包含所有帖子,精选图片也是一种帖子并存储在此表中。 wp_postmeta表包含与帖子id链接的不同元数据,_thumbnail_id key的值是帖子类型'attachment'的ID。下面的查询将澄清我想说的一点。SQL SELECT查询由MySQL服务器没有响应,并得到任何结果

Select * From wp_posts 
Where ID In (Select meta_value 
    From wp_postmeta 
    Where meta_key='_thumbnail_id' 
    And post_id In (Select ID From wp_posts 
     Where post_type='$post_type')); 

而wp_post包含大约10k行,而wp_postmeta包含大约70k行。感谢所有帮助。如果你们告诉我如何将特定的帖子类型从缩略图从一个wordpress安装迁移到另一个wordpress安装,这也会很棒。

回答

1

我觉得嵌套IN条款很可能你的性能问题的根源。你需要一个适度复杂的查询,因为WordPress的1)存储您的文章,其中包含您post_type为一排wp_posts,2)wp_posts缩略图“附件”的另一行,以及3)wp_postmeta附件的元数据。我确信这就是为什么你在使用嵌套的IN s但是IN s不是特别有效。

您的查询工作,但与数据库你的尺寸你可能运行的内存或时间,或两者兼而有之。在我的数据库,这是小得多,你的查询执行0.0123秒。以下查询完全重复您的查询结果,在0.0006秒内执行。

SELECT children.* 
FROM wp_posts as children 
JOIN wp_posts as parents on parents.ID = children.post_parent 
WHERE children.ID IN (
    SELECT meta_value 
    FROM wp_postmeta 
    WHERE post_id = parents.ID 
    AND meta_key='_thumbnail_id' 
) 
AND parents.post_type='{$post_type}' 

鉴于它从我的数据库中返回4行,您可以看到什么是巨大的执行差异。

下面的查询并不比上面的那个(0.0013秒)慢得多,但不是返回先前查询(一个在我的情况下,额外的)返回的行,而且比你还快很多倍。我认为这是你想要的查询。

SELECT * 
FROM wp_posts as children 
JOIN wp_posts as parents on parents.ID = children.post_parent 
JOIN wp_postmeta ON parents.ID = wp_postmeta.post_id 
AND wp_postmeta.meta_key = '_thumbnail_id' 
AND children.post_type = 'attachment' 
AND parents.post_type = '{$post_type}'