【问题标题】:SQL Query not returning resultsSQL 查询不返回结果
【发布时间】:2012-05-08 11:44:54
【问题描述】:

我正在使用三类复选框来过滤来自 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 个帖子属于 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 直到我让它工作。

【问题讨论】:

    标签: sql filter


    【解决方案1】:

    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
    

    【讨论】:

    • 这更具可扩展性,但我要指出它只有在值是唯一的情况下才有效,因此它不能两次具有相同的值
    • 我认为如果在每个类别中只选择一件事,这将起作用。如果我有 COUNT(*) > 2 但查询'academia、'journalism'和'early-career',它不能返回带有'academia'和'journalism,但不是'early-career'的帖子吗?
    • @Kevin:是的,这是正确的,但我怀疑 WordPress 不允许这种情况发生。
    • @JoshAllen。你是对的,但正如我所说的那样,HAVING 子句中的数字应该与所选类别的数量相匹配。如果您选择 3 个类别,则子句将是 'HAVING COUNT(*) = 3'。
    • @weenoid 如果您访问我提到的网站,我有三个不同的“类别”,其中包含多个实际类别。如果我从第一个“类别”中选择两个,从第三个中选择一个,我希望它返回结果,如果它来自第一个类别并且有第三个(或者如果选择了多个,则至少有一个第三个)。如果我需要单级过滤,我认为这会很棒。在那种情况下,这会很棒。绝对为未来的项目添加书签。
    【解决方案2】:
    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... 行。

    【讨论】:

    • 这可行,但在选择大量类别时无法很好地扩展。
    • 我喜欢这个的外观,但我认为它不会完全按照我的意愿过滤。我想在类别内做一个 OR 过滤器,但跨类别做一个 AND 过滤器。例如,我希望它看起来像这样:WHERE ('academia' OR 'journalism') AND ('this' OR 'that') AND ('something' OR 'something-else')。这能用吗?
    • 我会为每个类别更改一个以上的内容吗?:(SELECT term_id from wp_terms where slug = 'academia' OR 'journalism')
    • @therealmitchconnors:您更新后的查询规模更小,现在您需要为每个指定的类别添加一个额外的查询。
    • 是的,此查询可以支持您的 AND/OR 要求(尽管我希望查看 UI!)。只需将 WHERE slug = '' 替换为 WHERE slug IN ('','') 并在括号中设置 OR。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多