我使用功能强大的低级插件(Exports and Reports)从Wordpress中提取内容报告。它使用原始SQL查询,以便在单个表中提取有关我的自定义帖子类型的所需数据。
鉴于Wordpress'表结构,特别是在分类信息周围,有很多JOINing正在进行提取单个表来导出。
这是一个简化版本(真正的版本有3个分类法和3个元值)。
SELECT p.post_title,
GROUP_CONCAT(DISTINCT type_terms.name) type,
pdf_posts.guid pub_url
FROM
wp_posts p
INNER JOIN wp_term_relationships tr_type ON p.ID=tr_type.object_id
INNER JOIN wp_term_taxonomy tax_type ON tr_type.term_taxonomy_id = tax_type.term_taxonomy_id
INNER JOIN wp_terms type_terms ON tax_type.term_id = type_terms.term_id
INNER JOIN wp_postmeta meta_attachment ON meta_attachment.post_id = p.ID
INNER JOIN wp_posts pdf_posts ON meta_attachment.meta_value = pdf_posts.ID
WHERE 1=1
AND p.post_type = 'pressmention'
AND tax_type.taxonomy = 'pm_type'
AND meta_attachment.meta_key = 'pm_pdf_link'
GROUP BY
p.ID
查询有效,但仅在自定义帖子中存在所有分类和元值时才返回记录。我需要它来返回所有自定义帖子,无论是否存在相应的分类或元值。
因此,在上述查询中,pm_type
分类的缺失值将导致帖子被排除。
对于元值,我正在加入将附件ID转换为URL。
我查看了OUTER LEFT JOIN和嵌套JOINS,以便在找不到分类法连接时获得结果,但没有运气。
答案 0 :(得分:0)
我认为我在这里尝试的查询风格可能是不必要的复杂。产生相同结果的另一种方法是连接一系列查询,每个查询都可以产生结果,即:
SELECT DISTINCT post_title
,(SELECT group_concat(wp_terms.name separator ', ')
FROM wp_terms
INNER JOIN wp_term_taxonomy on wp_terms.term_id = wp_term_taxonomy.term_id
INNER JOIN wp_term_relationships wpr on wpr.term_taxonomy_id = wp_term_taxonomy.term_taxonomy_id
WHERE taxonomy= 'pm_type' and wp_posts.ID = wpr.object_id
) AS "type"
,(SELECT guid FROM wp_posts attachment
INNER JOIN wp_postmeta on wp_postmeta.meta_value = attachment.ID
WHERE wp_postmeta.meta_key = 'pm_pdf_link' AND wp_postmeta.post_id = wp_posts.ID) AS "pub_url"
FROM wp_posts
WHERE post_type = 'pressmention'
AND post_status = 'publish'
虽然这可能不如单个SELECT语句执行,但是当只有一些分类法具有值时,它更容易阅读并且将返回后记录。