我必须在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
答案 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
似乎有效!