[英]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.