如何将SQL查询IN子句中的指定值附加到非空结果表?
解决方案:将指定的object_id值纳入查询结果
没问题!根据你的需求,分两种场景给你对应的实现方法:
场景1:仅在已有匹配结果中显示对应的object_id
如果你的目标只是把匹配到的行对应的object_id(也就是你IN子句里的那些值)明确显示在结果表中,那最简单的方式就是直接在SELECT列表里加上tr.object_id字段:
SELECT tr.object_id, -- 新增这一行,显示对应的目标ID t.*, tt.* FROM wp_terms AS t INNER JOIN wp_term_taxonomy AS tt ON t.term_id = tt.term_id INNER JOIN wp_term_relationships AS tr ON tr.term_taxonomy_id = tt.term_taxonomy_id WHERE tt.taxonomy IN ('nationality') AND tr.object_id IN (1099, 1401, 1646, 1087, 1610, 1293) ORDER BY t.name ASC;
这样每个结果行都会带上它对应的那个object_id,完全符合你“附加到非空查询结果”的需求。
场景2:确保所有指定的object_id都出现在结果中(即使无匹配分类)
如果你的需求是不管某个object_id有没有对应的分类信息,都要把它列在结果里,那就要用LEFT JOIN配合临时数据集的方式来实现:
SELECT ids.object_id, t.*, tt.* FROM -- 构造包含所有目标object_id的临时数据集 (SELECT 1099 AS object_id UNION ALL SELECT 1401 UNION ALL SELECT 1646 UNION ALL SELECT 1087 UNION ALL SELECT 1610 UNION ALL SELECT 1293) AS ids LEFT JOIN wp_term_relationships AS tr ON ids.object_id = tr.object_id LEFT JOIN wp_term_taxonomy AS tt ON tr.term_taxonomy_id = tt.term_taxonomy_id AND tt.taxonomy = 'nationality' -- 将分类条件移到关联中,避免过滤无匹配的ID LEFT JOIN wp_terms AS t ON t.term_id = tt.term_id ORDER BY t.name ASC, ids.object_id ASC;
这个查询的关键逻辑:
- 先用
UNION ALL创建了一个包含所有你指定ID的临时表ids,保证所有目标ID都会被纳入结果。 - 用
LEFT JOIN替代原来的INNER JOIN,这样即使某个ID没有对应的分类关系或分类数据,也会保留该行,对应的t.*和tt.*字段会显示为NULL。 - 把
tt.taxonomy = 'nationality'的条件从WHERE移到LEFT JOIN的关联条件里,避免过滤掉那些没有匹配到该分类的ID行。
你可以根据自己的实际需求选择对应的方案~
内容的提问来源于stack exchange,提问作者Andrius Solopovas
相关产品推荐
相关产品推荐

