一如既往地提前感谢您的帮助。我已经被这个问题困扰了好几天了,无法理解它。最后的努力张贴在这里。
我想要实现的目标 - 获取所有与“house”和“nightclub”匹配的object_id
这涉及到连接 3 个表以达到
WP_2_TERMS
--------------------------------------------------------
term_id | name | slug | term_group |
3 nightclub nightclub 0
41 house house-3 0
--------------------------------------------------------
WP_2_TAXONOMY
-------------------------------------------------------
term_taxonomy_id | term_id | taxonomy |
3 3 category
42 41 Music
-------------------------------------------------------
WP_2_TERM_RELATIONSHIPS
-------------------------------------------------------
object_id | term_taxonomy_id | term_order |
13 4 0
13 42 0
65 3 0
65 42 0
111 3 0
-------------------------------------------------------
所以理想情况下,sql 只会输出 object_id 65 但目前它返回 0 行
到目前为止,这就是我所拥有的。谁能看到我做错了什么,并愿意解释一下吗?
SELECT `rel`.`object_id`
FROM `wp_2_term_relationships` as `rel`
INNER JOIN `wp_2_term_taxonomy` as `tax` ON rel.term_taxonomy_id = tax.term_taxonomy_id
LEFT JOIN `wp_2_terms` as `terms` ON tax.term_id = terms.term_id
LEFT JOIN `wp_2_terms` as `terms2` ON tax.term_id = terms2.term_id
WHERE terms.name LIKE '%house% AND terms2.name LIKE '%nightclub%'
另外,是的,我知道这可以通过 wp_query 完成,但我正在从 Wordpress 迁移,所以不幸的是,目前这是最好的解决方案!
最佳答案
您遇到的问题是,即使您连接表 wp_2_terms
两次,您还是连接到同一列 (tax.term_id
),因此 terms.name
将始终与 terms2.name
相同,并且由于它们相同,因此它们不能同时是 nightclub
和 house
.
标准方法是使用GROUP BY/HAVING
:
SELECT rel.object_id
FROM wp_2_term_relationships AS rel
INNER JOIN wp_2_term_taxonomy AS tax
ON rel.term_taxonomy_id = tax.term_taxonomy_id
INNER JOIN wp_2_terms AS terms
ON tax.term_id = terms.term_id
WHERE terms.Name IN ('house', 'nightclub')
GROUP BY rel.object_id
HAVING COUNT(DISTINCT terms.Name) > 1;
如果使用 LIKE
是强制性的而不是简单地等于,您可以重写为:
SELECT rel.object_id
FROM wp_2_term_relationships AS rel
INNER JOIN wp_2_term_taxonomy AS tax
ON rel.term_taxonomy_id = tax.term_taxonomy_id
INNER JOIN wp_2_terms AS terms
ON tax.term_id = terms.term_id
WHERE terms.Name LIKE '%house%'
OR terms.Name LIKE '%nightclub%'
GROUP BY rel.object_id
HAVING COUNT(CASE WHEN terms.Name LIKE '%house%' THEN 1 END) >= 1
AND COUNT(CASE WHEN terms.Name LIKE '%nightclub%' THEN 1 END) >= 1;
关于mysql - 使用 Like AND Like - Not Or 调用 object_id 的 SQL 语句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26235329/