MySQL查询需求:筛选同时包含指定post_data值的Posts记录
同时包含指定多值的关联表查询
要筛选出对应Post_Data记录同时包含hello和test的Posts数据,你可以用以下几种MySQL查询方式实现:
方法1:分组统计 + HAVING子句
这种方式通过分组统计每个post_id匹配目标值的数量,筛选出数量等于目标值个数的条目:
SELECT p.id, p.name FROM Posts p JOIN Post_Data pd ON p.id = pd.post_id WHERE pd.value IN ('hello', 'test') GROUP BY p.id, p.name HAVING COUNT(DISTINCT pd.value) = 2;
解释:先关联两张表,筛选出值为hello或test的记录,按Posts的id和name分组后,通过HAVING确保当前分组同时包含两个不同的目标值。
方法2:多次关联Post_Data表
通过两次JOIN操作分别匹配不同的目标值,确保两个条件同时满足:
SELECT p.id, p.name FROM Posts p JOIN Post_Data pd1 ON p.id = pd1.post_id AND pd1.value = 'hello' JOIN Post_Data pd2 ON p.id = pd2.post_id AND pd2.value = 'test';
解释:每一次JOIN都对应一个目标值的匹配,只有同时满足两次JOIN条件的Posts才会被返回。
方法3:子查询取交集
通过两个子查询分别获取包含hello和test的post_id,再取交集关联Posts表:
SELECT p.id, p.name FROM Posts p WHERE p.id IN ( SELECT post_id FROM Post_Data WHERE value = 'hello' ) AND p.id IN ( SELECT post_id FROM Post_Data WHERE value = 'test' );
解释:先分别筛选出包含单个目标值的post_id集合,再取两个集合的交集,最终关联Posts表获取对应数据。
内容的提问来源于stack exchange,提问作者Rex Banner
相关产品推荐
相关产品推荐

