SQL查询以获取自定义帖子类型和可选分类法

时间:2016-03-16 11:15:50

标签: mysql wordpress

我使用功能强大的低级插件(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,以便在找不到分类法连接时获得结果,但没有运气。

1 个答案:

答案 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语句执行,但是当只有一些分类法具有值时,它更容易阅读并且将返回后记录。