2014-09-12 47 views
0

我生產的wordpress的rss飼料,並且要​​求是應該按促銷日期排序,如果促銷日期設置爲文章,或者使用post_date,否則我會上傳 與以下SQL。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

對於$ slug的「terms」和WHERE子句中的「term_taxonomy」,您在查詢中有兩個「AND」條件,從而將您的LEFT-JOIN變爲INNER-JOIN。我已經將這些移動到了LEFT JOIN組件。你應該是不錯的,否則(也,我剛申請的別名爲表VS長手寫的可讀性)

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)