mysql - MySQL 查询检索两个类别中的标签(不是 OR)[WordPress 原始 SQL]
问题描述
挣扎了一段时间
SELECT DISTINCT terms2.term_id as tag_id, terms2.name as tag_name, terms2.slug as tag_slug, t2.description as tag_desc
FROM
wp_posts as p1
LEFT JOIN wp_term_relationships as r1 ON p1.ID = r1.object_ID
LEFT JOIN wp_term_taxonomy as t1 ON r1.term_taxonomy_id = t1.term_taxonomy_id
LEFT JOIN wp_terms as terms1 ON t1.term_id = terms1.term_id,
wp_posts as p2
LEFT JOIN wp_term_relationships as r2 ON p2.ID = r2.object_ID
LEFT JOIN wp_term_taxonomy as t2 ON r2.term_taxonomy_id = t2.term_taxonomy_id
LEFT JOIN wp_terms as terms2 ON t2.term_id = terms2.term_id
WHERE
t1.taxonomy = 'product_cat' AND p1.post_status = 'publish' AND terms1.term_id IN (224,229) AND
t2.taxonomy = 'product_tag' AND p2.post_status = 'publish'
AND p1.ID = p2.ID
ORDER by tag_name
我正在处理的线路是这一行:
t1.taxonomy = 'product_cat' AND p1.post_status = 'publish' AND terms1.term_id IN (224,229) AND
这行得通,但是该IN
子句充当OR
--- 因此它带回了位于term_id
224
or中的标签229
我正在尝试使它只返回同时存在的标签224
和229
我试过了
t1.taxonomy = 'product_cat' AND p1.post_status = 'publish' AND terms1.term_id = '224' AND
t1.taxonomy = 'product_cat' AND p1.post_status = 'publish' AND terms1.term_id = '229' AND
但它只返回一个空结果......
我现在唯一的解决方案是terms1.term_id = '224'
对224
和 terms1.term_id = '229' 进行两次查询229
,然后使用其他逻辑返回两个匹配项。
有没有办法将它组合成一个查询?
编辑:查看下面的 IN 查询结果(修改后terms1.term_id
可见)
如您所见Gray
,仅在 229 中(因此不是我试图返回的结果集的一部分)
解决方案
@BrianBruman 我假设这terms1.term_id
是一个逗号分隔的值列表。如果是这种情况,您可以使用FIND_IN_SET()
来确保两者224
都229
在逗号分隔列表中。
这是您的查询需要的样子,以便同时使用224
and获取标签229
:
SELECT DISTINCT terms2.term_id as tag_id,
terms2.name as tag_name,
terms2.slug as tag_slug,
t2.description as tag_desc
FROM
wp_posts as p1
LEFT JOIN wp_term_relationships as r1 ON p1.ID = r1.object_ID
LEFT JOIN wp_term_taxonomy as t1 ON r1.term_taxonomy_id = t1.term_taxonomy_id
LEFT JOIN wp_terms as terms1 ON t1.term_id = terms1.term_id
JOIN wp_posts as p2 ON p2.ID = p1.ID
LEFT JOIN wp_term_relationships as r2 ON p2.ID = r2.object_ID
LEFT JOIN wp_term_taxonomy as t2 ON r2.term_taxonomy_id = t2.term_taxonomy_id
LEFT JOIN wp_terms as terms2 ON t2.term_id = terms2.term_id
WHERE
t1.taxonomy = 'product_cat'
AND p1.post_status = 'publish'
AND (
FIND_IN_SET('224', terms1.term_id) > 0
AND FIND_IN_SET('229', terms1.term_id) > 0
)
AND t2.taxonomy = 'product_tag'
AND p2.post_status = 'publish'
ORDER by tag_name
编辑:根据您的最后评论,terms1.term_id
不是逗号分隔列表。在这种情况下,您需要加入另一个wp_terms
. 这是您的查询需要的样子:
SELECT DISTINCT terms2.term_id as tag_id,
terms2.name as tag_name,
terms2.slug as tag_slug,
t2.description as tag_desc
FROM
wp_posts as p1
LEFT JOIN wp_term_relationships as r1 ON p1.ID = r1.object_ID
LEFT JOIN wp_term_taxonomy as t1 ON r1.term_taxonomy_id = t1.term_taxonomy_id
LEFT JOIN wp_terms as terms1 ON t1.term_id = terms1.term_id
LEFT JOIN wp_terms as terms3 ON t1.term_id = terms3.term_id
JOIN wp_posts as p2 ON p2.ID = p1.ID
LEFT JOIN wp_term_relationships as r2 ON p2.ID = r2.object_ID
LEFT JOIN wp_term_taxonomy as t2 ON r2.term_taxonomy_id = t2.term_taxonomy_id
LEFT JOIN wp_terms as terms2 ON t2.term_id = terms2.term_id
WHERE
t1.taxonomy = 'product_cat'
AND p1.post_status = 'publish'
AND terms1.term_id = '224'
AND terms3.term_id = '229'
AND t2.taxonomy = 'product_tag'
AND p2.post_status = 'publish'
ORDER by tag_name
最后一件事:如果您只希望结果显示 wherewp_posts
有相应的记录wp_terms
,并且您不应该使用on ,则应该使用常规 old ,这将大大提高查询的性能。term_id
224
229
LEFT JOIN
wp_terms
JOIN
希望这可以帮助!
推荐阅读
- javascript - 对象解构在 ReactJs 脚本中不起作用
- netsuite - NetSuite SuiteScript 2.0 - 从内部 ID 获取销售团队名称
- java - 计算矩阵行列式的问题(在 Java 中)。始终为 0
- java - Apache 虚拟主机 proxypass 不适用于 HTTPS 中的根 url
- c# - 如何在 c# 中反序列化这个 json 文本并且类名不能是数字
- amazon-web-services - 从转录作业的 S3 对象键中删除特殊字符
- environment-variables - 放大保存环境变量到后端
- flutter - Flutter 的 Firebase 文档不适用于删除用户
- reactjs - 使用 Typescript 的 SWR Vercel 全局配置
- macos - Sparkle Updater 的 generate_appcast 工具基本用法