带有AND和OR的HAVING COUNT(DISTINCT)的mySql查询(包含和排除子句)

时间:2015-09-27 10:19:32

标签: mysql count distinct having-clause

我必须在Wordpress站点内修改mySql自定义查询。 我将尝试向您解释我的问题,将查询简化为真正需要知道的问题。

表格 cms_posts (别名' p')是INNER JOINED到 cms_term_relationship 表(别名' term_rel')。
我需要找到所有 cms_posts ,其中 term_rel.term_taxonomy 值包含在211,210,10,9中。
我目前的疑问是:

SELECT SQL_CALC_FOUND_ROWS 
    p.id
FROM cms_posts p 
    INNER JOIN cms_term_relationships term_rel 
        ON term_rel.object_id = p.id 
WHERE
    term_rel.term_taxonomy_id IN (211,210,10,9)
GROUP BY p.id
HAVING  
    COUNT(DISTINCT term_rel.term_taxonomy_id) = 4
LIMIT 0, 50

COUNT(DISTINCT 确保我在WHERE子句中询问的所有关系都严格遵循。

这一切都完美无瑕。

但我需要修改查询!
我需要拆分WHERE子句。我试着举个例子。

我需要在211 AND 210中使用term_taxonomy的所有帖子,但在10 OR 9中。 我搜索所有这些帖子的组合:
211,210,10 211,210,9 所以我需要211和210 都需要,但也只需要1次出现10 OR 9。

详细地说,我需要我的帖子是X,Y,Z类别,至少是A,B或C类别。 X,Y,Z类别是独占性的; A,B,C是包容性的。

这个问题并不容易解释,而我可怕的英语也没有帮助 我希望有人能理解我的英语甚至是我的问题:D

2 个答案:

答案 0 :(得分:0)

带有having的{​​{1}}子句仍然是一种有效的方法。例如,您可以使用case表达式来对ID 9和10进行相同处理,从而允许您继续计算所需的不同数字ID。 E.g:

count distinct

答案 1 :(得分:0)

感谢Mureinik的答案,但如果我尝试实现您的代码,使用案例表达式似乎不起作用。如果我很好地了解你的目标,那么CASE所有的'包容性术语',但第一个,都没有被COUNT考虑(DISTINCT。我可能没有以正确的方式实现你的代码,但结果并不好够了。

但也许我有一个解决方案。 让我试着给你一个更好的解释:
- exclusive_terms.term_taxonomy_id 是要搜索的字段;
- exclusive_terms.term_taxonomy_id 独占值列表 - exclusive_terms.term_taxonomy_id

还有一个包含值的列表

如果用户搜索 exclusive_terms.term_taxonomy_id 的211,210,9,217,215,218,10值,我首先需要做的是将独占与包容性分开那些。

我获得了2个名单:
- 独家211,210
- 包括9,217,215,218,10

之后,我可以在同一个字段上使用 2 JOINS 编写此查询,但调用带有2个不同别名的结果字段,然后创建一个COUNT(DISTINCT仅限于排他条款。

SELECT SQL_CALC_FOUND_ROWS p.id,
FROM cms_posts p
    INNER JOIN cms_term_relationships exclusive_terms ON exclusive_terms.object_id = p.id
    INNER JOIN cms_term_relationships inclusive_terms ON inclusive_terms.object_id = p.id
WHERE 
    exclusive_terms.term_taxonomy_id IN (211, 210) 
    AND
    inclusive_terms.term_taxonomy_id IN (9, 217, 215, 218, 10)
GROUP BY p.id 
HAVING
    COUNT(DISTINCT exclusive_terms.term_taxonomy_id) = 2
LIMIT 0, 50

似乎有效!

相关问题