我正在为 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;
问题是左连接似乎不会返回没有促销日期的条目。当没有匹配项时,左连接通常会选择第一个表中的所有列,而第二个表中的条目为空。为什么这种情况没有发生?
最佳答案
您在查询 $slug 的“terms”和 WHERE 子句中的“term_taxonomy”时有两个“AND”条件,从而将您的 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)
关于mysql - SQL 左连接没有给我空条目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25806322/