这个简单的选择不会做你需要的。
select ID, name, term_id from yourtable where name LIKE '%Lighting%' and a term_id = 26
SELECT a.ID, d.name, d.term_id FROM cn_posts AS a INNER JOIN cn_postmeta AS b ON a.ID = b.post_id INNER JOIN cn_term_relationships AS c ON a.ID = c.object_id INNER JOIN cn_terms AS d ON c.term_taxonomy_id = d.term_id INNER JOIN cn_terms AS d2 ON c.term_taxonomy_id = d2.term_id WHERE a.post_status = 'publish' AND d.name LIKE '%Lighting%' AND d2.term_id = '26'
由于条件在不同的行上,因此必须两次加入cn_terms。
SELECT a.ID, d.name, d.term_id, a.post_status FROM wp_posts AS a JOIN wp_postmeta AS b ON a.ID = b.post_id JOIN wp_term_relationships AS c ON a.ID = c.object_id JOIN wp_terms AS d ON c.term_taxonomy_id = d.term_id WHERE a.post_status = 'publish' AND d.name LIKE '%Halogen%' AND d.term_id = '25' GROUP BY a.ID
显然,表中没有单行(您的数据样本)与条件匹配 d.name LIKE '%Lighting%' AND d.term_id = '26' 。有与第一部分匹配的行和与第二部分匹配的行,但没有匹配两者的行。但是,如果作为一个 组 行, ID = 277 确实符合条件。因此,您需要引入分组并在HAVING子句中应用条件(尽管稍作修改),如下所示:
d.name LIKE '%Lighting%' AND d.term_id = '26'
ID = 277
SELECT a.ID FROM cn_posts AS a INNER JOIN cn_postmeta AS b ON a.ID = b.post_id INNER JOIN cn_term_relationships AS c ON a.ID = c.object_id INNER JOIN cn_terms AS d ON c.term_taxonomy_id = d.term_id WHERE a.post_status = 'publish' GROUP BY a.ID HAVING COUNT(d.name LIKE '%Lighting%' OR NULL) > 0 AND COUNT(d.term_id = '26' OR NULL) > 0 ;
但请注意,这意味着您无法获得详细信息 d.name 要么 d.term 与同一查询中的ID一起(但从中拉出其他列) a 在这种情况下会没事的。)如果回来了 d 同一查询中的列对于解决您的问题是必需的,您可能需要在几乎相同的查询中使用上述作为派生表 所有 您需要的数据。在这种情况下,派生表将用作将ID集合过滤到仅匹配两个条件的ID的方法。在该主查询中,需要将两个条件连接起来 OR 而不是 AND , 像这样:
d.name
d.term
a
d
OR
AND
SELECT a.ID, d.name, d.term_id FROM cn_posts AS a INNER JOIN cn_postmeta AS b ON a.ID = b.post_id INNER JOIN cn_term_relationships AS c ON a.ID = c.object_id INNER JOIN cn_terms AS d ON c.term_taxonomy_id = d.term_id WHERE a.post_status = 'publish' AND (d.name LIKE '%Lighting%' OR d.term_id = '26') AND a.ID IN ( /* the above query, now used just as a filter */ SELECT a.ID FROM cn_posts AS a INNER JOIN cn_postmeta AS b ON a.ID = b.post_id INNER JOIN cn_term_relationships AS c ON a.ID = c.object_id INNER JOIN cn_terms AS d ON c.term_taxonomy_id = d.term_id WHERE a.post_status = 'publish' GROUP BY a.ID HAVING COUNT(d.name LIKE '%Lighting%' OR NULL) > 0 AND COUNT(d.term_id = '26' OR NULL) > 0 ) ;
显然,这几乎不会比你最终的查询更好。
你试过这个吗?
SELECT a.ID, d.name, d.term_id FROM cn_posts AS a INNER JOIN cn_postmeta AS b ON a.ID = b.post_id INNER JOIN cn_term_relationships AS c ON a.ID = c.object_id INNER JOIN cn_terms AS d ON c.term_taxonomy_id = d.term_id WHERE a.post_status = 'publish' AND d.name LIKE '%Lighting%' AND d.term_id = '28' GROUP BY a.ID
在得到所有人的帮助之后(非常感谢!!)我最终只是使用了这个查询,这个查询不是最干净但是唯一一个得到我所追求的结果的查询,我需要让工作顺利进行。
还匹配帖子标题和说明上的关键字以及服务名称。
SELECT a.ID, a.post_title, a.post_status, d.name, d.term_id FROM cn_posts AS a JOIN cn_postmeta AS b ON a.ID = b.post_id JOIN cn_term_relationships AS c ON a.ID = c.object_id JOIN cn_terms AS d ON c.term_taxonomy_id = d.term_id WHERE a.post_status = 'publish' AND ( a.post_title LIKE '%Lighting%' OR a.post_content LIKE '%Lighting%' OR d.name LIKE '%Lighting%' ) AND a.ID IN ( SELECT a.ID FROM cn_posts AS a INNER JOIN cn_postmeta AS b ON a.ID = b.post_id INNER JOIN cn_term_relationships AS c ON a.ID = c.object_id INNER JOIN cn_terms AS d ON c.term_taxonomy_id = d.term_id WHERE d.term_id = '26' ) GROUP BY a.ID
非常感谢你们的帮助。显然,如果你能弄清楚为什么其他查询不起作用或者可以清理这个查询,请随时回复。
戴夫