SQL查询未返回结果

SQL查询未返回结果,sql,filter,Sql,Filter,我使用三类复选框来筛选WordPress的帖子。这个问题是关于查询的,我知道我应该通过以下查询返回结果,我会根据筛选中选择的内容自动生成第7行: 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

我使用三类复选框来筛选WordPress的帖子。这个问题是关于查询的,我知道我应该通过以下查询返回结果,我会根据筛选中选择的内容自动生成第7行:

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个职位属于学术和早期职业类别

如果我将第7行更改为只在语句中包含一个类别,它会很好地过滤该类别:

wp_terms.slug IN ('academia','journalism') //More than one from same category
AND wp_term_taxonomy.taxonomy = 'jobtype'......
它会找到我所期望的所有学术或新闻工作,但当我在声明中添加另一份时,即使我有符合逻辑的帖子,也不会返回任何内容

有谁能告诉我是否有什么问题,可能是IN和值之间的空格?因为我已经在这方面工作了好几天,运气都不好

非常感谢您的帮助!谢谢

另外,如果有人想看看这个网站,这是为了了解我的意思:


目前,我有一个全局的或,而不是任何IN,直到我让它工作。

在IN子句中指定多个值时,该行必须与其中一个值匹配。在子句中指定2表示行必须同时匹配两者,这是不可能的。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
编辑 要支持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

您可以添加和wp_术语_分类法。。。在代码中,行的次数可以根据需要而定。

这会起作用,但在选择了大量类别时,扩展性不好。我喜欢这一行的外观,但我认为它无法准确过滤我想要的内容。我想在类别内执行OR筛选,但在类别之间执行AND筛选。例如,我希望它看起来像这样:“学术界”或“新闻界”和“这个”或“那个”以及“某物”或“其他东西”。这是否适用于它?我是否会将其更改为每个类别不止一个?:从slug='Academy'或'journalism'的wp_terms中选择term_id?@therealmitchconnors:您更新的查询规模更小,现在您需要为指定的每个类别添加额外的查询。是的,此查询可以支持您的和/或要求,但我希望看到该查询的UI!。只需将WHERE slug=to WHERE slug IN替换为括号中的或。这更具可伸缩性,但我要指出,只有当值是唯一的,所以它不能有相同的值时,它才起作用。我认为,如果在每个类别中只选择一个值,这将起作用。如果我有COUNT*>2但查询“学术界”、“新闻界”和“早期职业”,它不能返回“学术界”和“新闻界,但不是“早期职业”的帖子吗?@Kevin:是的,这是正确的,但我怀疑WordPress不允许这种情况发生。@Joshlen。你是对的,但正如我所说,HAVING子句中的数字应该与所选类别的数量相匹配。如果您选择3个类别,该子句将为“HAVING COUNT*=3”。@weenoid如果您访问我提到的站点,我有三个不同的“类别”,其中包含多个实际类别。如果我从第一个“类别”中选择了两个,从第三个中选择了一个,我希望它返回结果(如果它来自第一个类别并且具有第三个类别),或者如果选择了多个类别,则至少返回第三个类别中的一个。我认为如果我需要单级过滤,这将是非常好的。那样的话,这就太好了。绝对是未来项目的书签。
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