MySQL查询求助:需同时满足wp_postmeta表两个键值条件
解决wp_postmeta多条件查询问题
你的需求是找出同时拥有以下两个元数据记录的post对应的相关记录,原SQL的问题在于未按post_id分组,导致HAVING条件无法正确筛选出同时满足两个条件的post。
问题分析
wp_postmeta采用键值对存储结构,每个post的不同元数据是单独的行。原查询使用OR拉取所有满足任一条件的行,但未对post_id分组,COUNT(DISTINCT meta_key)=2是统计整个结果集的键数量,而非单个post的元数据数量,逻辑不成立。
正确查询方案
方案一:先筛选符合条件的post_id,再关联获取元数据
这种方式先找出同时拥有两个指定元数据的post,再获取这些post的所有元数据记录:
SELECT pm.* FROM wp_postmeta pm INNER JOIN ( SELECT post_id FROM wp_postmeta WHERE (meta_key = '_tribe_wooticket_product' AND meta_value = '1109') OR (meta_key = '_tribe_wooticket_checkedin' AND meta_value = '1') GROUP BY post_id HAVING COUNT(DISTINCT meta_key) = 2 ) AS valid_posts ON pm.post_id = valid_posts.post_id
方案二:自连接匹配同时满足两个条件的post
如果你只需要这两个元数据本身的记录,可以用自连接直接匹配同一post下的两个元数据:
SELECT pm1.*, pm2.* FROM wp_postmeta pm1 INNER JOIN wp_postmeta pm2 ON pm1.post_id = pm2.post_id WHERE pm1.meta_key = '_tribe_wooticket_product' AND pm1.meta_value = '1109' AND pm2.meta_key = '_tribe_wooticket_checkedin' AND pm2.meta_value = '1'
注意事项
- wp_postmeta的
meta_value字段通常为文本类型,建议给数值类值加上单引号(如'1109'),避免类型转换错误。 - 如果只需要特定字段,可将
SELECT pm.*替换为需要的字段名(如pm.post_id, pm.meta_key, pm.meta_value)。
内容的提问来源于stack exchange,提问作者Miso
相关产品推荐
相关产品推荐

