2014-09-12 6 views
0

나는 wordpress를위한 rss 피드를 만들고있다. 프로모션 날짜가 기사의 세트로되어 있거나, post_date를 사용한다면, promotion date로 주문해야한다. 그렇지 않다면 나는 up 다음 SQL로.SQL 왼쪽 join은 나에게 null 엔트리를주지 않는다.

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; 

문제는 왼쪽 가입이 프로모션 날짜가없는 항목을 반환하지 않는 것 같습니다. 일반적으로 왼쪽 조인은 일치하는 항목이 없을 때 두 번째 항목에 대해 null 항목이있는 첫 번째 테이블의 모든 열을 선택합니다. 이 경우 왜 그렇게되지 않습니까?

답변

1

$ slug에 대한 "terms"및 WHERE 절의 "term_taxonomy"에 대한 쿼리에 "AND"조건이있어서 LEFT-JOIN을 INNER-JOIN으로 전환했습니다. LEFT JOIN 구성 요소로 이동했습니다. 당신은 그렇지 않으면 좋은해야, 내가 (post_status, post_type에 귀하의 게시물 테이블에 인덱스를 제안, 쿼리 성능을

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_date)

관련 문제