2014-06-25 362 views
0

我正在为WordPress编写一个SQL查询,用于搜索用户搜索之间的活动事件。我现在正在对它进行硬编码测试。SQL返回重复结果

目前,每当post_id出现在wp_postmeta表中时,都会返回两个事件,任何人都可以看到哪里可能存在这个逻辑的问题?

SELECT ID, post_title 
    FROM $wpdb->posts AS post 
    INNER JOIN $wpdb->postmeta AS meta 
    ON (post.ID = meta.post_id) 
    INNER JOIN $wpdb->postmeta AS meta2 
    ON (post.ID = meta2.post_id) 
    WHERE post.post_status = 'publish' 
    AND post.post_type = 'event' 
    AND post.post_author = '1' 
    AND (
      ((meta.meta_key = 'date_0_start-date' AND meta.meta_value < '20140620') AND (meta2.meta_key = 'date_0_end-date' AND meta2.meta_value > '20140630')) 
     OR ((meta.meta_key = 'date_0_start-date' AND meta.meta_value < '20140620') AND (meta2.meta_key = 'date_0_end-date' AND meta2.meta_value >= '20140620')) 
     OR ((meta.meta_key = 'date_0_start-date' AND meta.meta_value > '20140620') AND (meta.meta_key = 'date_0_start-date' AND meta.meta_value <= '20140630')) 
     OR ((meta.meta_key = 'date_0_start-date' AND meta.meta_value >= '20140620') AND (meta2.meta_key = 'date_0_end-date' AND meta2.meta_value <= '20140630')) 
    ) 

回答

1

你必须使用DISTINCT

SELECT DISTINCT ID, post_title

,而不是

SELECT ID, post_title

+0

完美!谢谢! – lukeseager

1

如果我理解正确的问题,我想你需要的最后一个括号部分where clause to look like this

meta.meta_key = 'date_0_start-date' AND meta.meta_value <= '20140630' and 
meta2.meta_key = 'date_0_end-date' AND meta2.meta_value >= '20140620' 

这应该与重叠的日期范围“20140620”的任何事件为“20140630”

+0

谢谢,这比我的查询更容易阅读 – lukeseager