2012-04-27 172 views
0

我使用三类复选框来过滤来自WordPress的帖子(这个问题是关于查询的),我知道一个事实,我应该返回结果与以下查询(我生成第7行自动依据是什么在我的过滤器中选择'S):SQL查询不返回结果

SELECT * FROM wp_posts 
LEFT JOIN wp_postmeta ON(wp_posts.ID = wp_postmeta.post_id) 
LEFT JOIN wp_term_relationships ON(wp_posts.ID = wp_term_relationships.object_id) 
LEFT JOIN wp_term_taxonomy ON(wp_term_relationships.term_taxonomy_id = wp_term_taxonomy.term_taxonomy_id) 
LEFT JOIN wp_terms ON(wp_terms.term_id = wp_term_taxonomy.term_id) 
WHERE 
    wp_terms.slug IN ('academia') AND wp_terms.slug IN ('early-career') 
    AND wp_term_taxonomy.taxonomy = 'jobtype' 
    AND wp_posts.post_status = 'publish' 
    AND wp_posts.post_type = 'jobs' 
GROUP BY wp_posts.ID ORDER BY wp_posts.post_date DESC 

我至少有5个职位,有是在类别academiaearly-career

如果我改变第7行只是有一个IN声明,它过滤是一类就好:

wp_terms.slug IN ('academia','journalism') //More than one from same category 
AND wp_term_taxonomy.taxonomy = 'jobtype'...... 

它会发现,要么是学术界抑或新闻(正是我所期望的)的所有作业,但是当我在其他IN语句中添加时,不会返回任何内容(即使我的帖子与逻辑匹配)。

任何人都可以告诉我,如果有什么不对(可能是IN和值之间的空格?),因为我一直在这没有运气的日子。

任何帮助,非常感谢!谢谢!

P.S.如果有人想看看在现场,这是对(为看明白我的意思):http://www.libertyguide.com/jobs

目前,我有一个全球性的,而不是OR任何IN的,直到我得到这个工作。

回答

0

IN子句中指定多个值表示该行必须匹配其中的一个值。指定2 IN子句指出该行必须匹配BOTH,这是不可能的(varchar不能同时是'学术'和'早期职业')。

尝试添加以下到您的查询的末尾:

HAVING COUNT(*) > [NUMBER OF VALUES SELECTED] 

所以就变成:

SELECT * FROM wp_posts 
LEFT JOIN wp_postmeta ON(wp_posts.ID = wp_postmeta.post_id) 
LEFT JOIN wp_term_relationships ON(wp_posts.ID = wp_term_relationships.object_id) 
LEFT JOIN wp_term_taxonomy ON(wp_term_relationships.term_taxonomy_id = wp_term_taxonomy.term_taxonomy_id) 
LEFT JOIN wp_terms ON(wp_terms.term_id = wp_term_taxonomy.term_id) 
WHERE 
    wp_terms.slug IN ('academia', 'early-career') 
    AND wp_term_taxonomy.taxonomy = 'jobtype' 
    AND wp_posts.post_status = 'publish' 
    AND wp_posts.post_type = 'jobs' 
GROUP BY wp_posts.ID ORDER BY wp_posts.post_date DESC 
HAVING COUNT(*) = 2 
+0

这是更具可扩展性,但我会指出,它只适用于值是唯一的,以便它不能有两次相同的值 – Kevin 2012-04-27 18:06:48

+0

我认为这将工作,如果只有一件事在每个类别中选择。如果我有HOWING COUNT(*)> 2但询问“学术界”,“新闻事业”和“早期职业”,是不是可以以'学术界'和'新闻业回归职位,但不是'早期职业'? – 2012-04-27 18:21:58

+0

@Kevin:是的,这是正确的,但我怀疑WordPress不允许发生这种情况。 – weenoid 2012-04-27 18:32:32

0
SELECT * FROM wp_posts 
LEFT JOIN wp_postmeta ON(wp_posts.ID = wp_postmeta.post_id) 
LEFT JOIN wp_term_relationships ON(wp_posts.ID = wp_term_relationships.object_id) 
LEFT JOIN wp_term_taxonomy ON(wp_term_relationships.term_taxonomy_id = wp_term_taxonomy.term_taxonomy_id) 
LEFT JOIN wp_terms wt1 ON(wt1.term_id = wp_term_taxonomy.term_id) 
LEFT JOIN wp_terms wt2 ON(wt2.term_id = wp_term_taxonomy.term_id) 
WHERE 
    wt1.slug = 'academia' AND wt2.slug = 'early-career' 
    AND wp_term_taxonomy.taxonomy = 'jobtype' 
    AND wp_posts.post_status = 'publish' 
    AND wp_posts.post_type = 'jobs' 
GROUP BY wp_posts.ID ORDER BY wp_posts.post_date DESC 

编辑 为了支持N类,你可以试试这个:

SELECT * FROM wp_posts 
LEFT JOIN wp_postmeta ON(wp_posts.ID = wp_postmeta.post_id) 
LEFT JOIN wp_term_relationships ON(wp_posts.ID = wp_term_relationships.object_id) 
LEFT JOIN wp_term_taxonomy ON(wp_term_relationships.term_taxonomy_id = wp_term_taxonomy.term_taxonomy_id) 
WHERE 
    wp_term_taxonomy.taxonomy = 'jobtype' 
    AND wp_posts.post_status = 'publish' 
    AND wp_posts.post_type = 'jobs' 
    AND wp_term_taxonomy.term_id IN (SELECT term_id from wp_terms where slug = 'academia') 
    AND wp_term_taxonomy.term_id IN (SELECT term_id from wp_terms where slug = 'early-career') 
GROUP BY wp_posts.ID ORDER BY wp_posts.post_date DESC 

您可以根据需要在代码中多次添加AND wp_term_taxonomy ...行。

+0

这将起作用,但在选择大量类别时效果不佳。 – weenoid 2012-04-27 18:00:52

+0

我已添加一个编辑以支持N个类别。 – therealmitchconnors 2012-04-27 18:06:35

+0

我喜欢这一款的外观,但我不认为它会过滤我想要的。我想在类别中执行OR过滤器,但是在类别之间使用AND过滤器。例如,我想让它看起来像这样:WHERE('academia'或'journalism')AND('this'或'that')和('something'或'something-else')。这将与它一起工作吗? – 2012-04-27 18:25:13