SQL左连接不给我空条目

时间:2014-09-12 10:35:43

标签: mysql wordpress

我正在为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;

问题是左连接似乎没有返回没有促销日期的条目。左连接通常选择第一个表中的所有列,当没有匹配时,第二个列为空条目。在这种情况下为什么不发生?

1 个答案:

答案 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)