繁体   English   中英

具有AND和OR(包含和不包含子句)的HAVING COUNT(DISTINCT)的MySQL查询

[英]mySql query with HAVING COUNT(DISTINCT) with AND and OR (inclusive and exclusive clause)

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

cms_posts (别名“ p”)已内联到cms_term_relationship表(别名“ term_rel”)中。
我NEET找到与包含在211,210,10,9一个term_rel.term_taxonomy值的所有cms_posts。
我当前的查询是:

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 210以及10 9中接受所有带有term_taxonomy的帖子。
我搜索帖子的所有这些组合:
211、210、10
211、210、9
所以我需要211和210 都需要 ,但是也只需要出现10 OR 9的1次。

详细地说,我需要我的帖子在X,Y,Z类别中,至少在A,B或C类别中。 X,Y,Z类别为排他性; A,B,C包括在内。

这个问题不是那么容易解释,而且我那可怕的英语也无济于事。
我希望有人能理解我的英语,甚至我的问题:D

having count distinct having子句仍然是有效的方法。 例如,您可以做的是使用一个case表达式将ID 9和10视为相同,从而使您可以继续计算所需的不同ID。 例如:

SELECT SQL_CALC_FOUND_ROWS 
    p.id
FROM vf_posts p 
    INNER JOIN vf_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 CASE term_rel.term_taxonomy_id 
                        WHEN 9 THEN 10 
                        ELSE term_rel.term_taxonomy_id
                   END) = 4 -- Here!
LIMIT 0, 50 

感谢Mureinik的回答,但是如果我尝试实现您的代码,则使用case表达式似乎无效。 如果我很好地理解了您的目标,那么在这种情况下,COUNT(DISTINCT)不会考虑所有“包含性条款”,但第一个不会被考虑。我可能没有以正确的方式实现您的代码,但结果并不理想足够。

但也许我有解决方案。 让我尝试为您提供更好的解释:
-Exclusive_terms.term_taxonomy_id是要搜索的字段;
-有对exclusive_terms.term_taxonomy_id 专属值的列表
-有也是exclusive_terms.term_taxonomy_id 包容值的列表

如果用户做出搜索211,210,图9,217,215,218,exclusive_terms.term_taxonomy_id的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

看来行得通!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM