我正在为wordpress生成一个rss feed,如果设置了促销日期,则应该按促销日期排序,或者使用post_date否则我来了 使用以下SQL。
SELECT $wpdb->posts.* from $wpdb->posts
LEFT JOIN $wpdb->term_relationships ON ($wpdb->posts.ID = $wpdb->term_relationships.object_id)
LEFT JOIN $wpdb->term_taxonomy ON ($wpdb->term_relationships.term_taxonomy_id = $wpdb->term_taxonomy.term_taxonomy_id)
LEFT JOIN $wpdb->terms ON ($wpdb->term_taxonomy.term_id = $wpdb->terms.term_id)
LEFT JOIN $wpdb->postmeta as m2 on ($wpdb->posts.ID=m2.post_id and m2.meta_key='promotion_date')
where now()>(CASE WHEN m2.meta_value IS NOT NULL
then cast(m2.meta_value as DATETIME)
ELSE $wpdb->posts.post_date END)
and $wpdb->posts.post_status='publish'
and $wpdb->posts.post_type='article'
and $wpdb->terms.slug = $slug
and $wpdb->term_taxonomy.taxonomy = 'article_$taxonomy'
order by CASE WHEN m2.meta_value IS NOT NULL
then cast(m2.meta_value as DATETIME)
ELSE $wpdb->posts.post_date
END DESC limit 100;
问题是左连接似乎没有返回没有促销日期的条目。左连接通常选择第一个表中的所有列,当没有匹配时,第二个列为空条目。在这种情况下为什么不发生?
答案 0 :(得分:1)
你有两个" AND"您查询"条款的标准"对于$ slug和" term_taxonomy"在WHERE子句中,从而将LEFT-JOIN转换为INNER-JOIN。我已将它们移动到LEFT JOIN组件。否则你应该是好的(同样,我只为表格使用别名而不是长篇写作以便于阅读)
SELECT
p.*
from
$wpdb->posts p
LEFT JOIN $wpdb->term_relationships tr
ON p.ID = tr.object_id
LEFT JOIN $wpdb->term_taxonomy tt
ON tr.term_taxonomy_id = tt.term_taxonomy_id
and tt.taxonomy = 'article_$taxonomy'
LEFT JOIN $wpdb->terms t
ON tt.term_id = t.term_id
and t.slug = $slug
LEFT JOIN $wpdb->postmeta as m2
on p.ID = m2.post_id
and m2.meta_key = 'promotion_date'
where
now() > ( CASE WHEN m2.meta_value IS NOT NULL
then cast(m2.meta_value as DATETIME)
ELSE p.post_date END )
and p.post_status = 'publish'
and p.post_type = 'article'
order by
CASE WHEN m2.meta_value IS NOT NULL
then cast(m2.meta_value as DATETIME)
ELSE p.post_date END DESC
limit 100;
对于查询性能,我建议你的帖子表上有一个索引(post_status,post_type,post_date)