mysql 一个字段多值同时匹配 group by having

在关联表中,有字段a和字段b,需要查找满足字段a多个值匹配时,字段b的集合

前提描述

t_restaurant_feature餐厅特性中,一个餐厅可包含多个特性

字段名说明
id记录id
restaurant_id餐厅id
feature_id特性id

餐厅特性表的数据如下 :
餐厅特性表的数据


t_feature 特性表

字段名说明
id记录id
name特性名称

特性表的数据如下:
特性表数据

问题

如何查找同时具有特性:有包厢、可带宠物和支持外卖的餐厅呢

尝试1,in (无法满足)

SELECT 
	distinct t1.restaurant_id 
FROM t_restaurant_feature t1 
LEFT JOIN t_feature t2 ON t2.id = t1.feature_id 
WHERE t1.feature_id IN (1,2,3)

结果好像不怎么理想:
in查询的结果

思考

in 相当于 多个值进行or操作,只要有一个满足即可,不符合pass

尝试2,group by having (正解)

分组后对每组的记录数进行统计,如果需要同时满足的特性数为3,则各个分组中记录总数为3的符合条件,具体sql如下:

SELECT 
	restaurant_id 
FROM t_restaurant_feature  
WHERE feature_id IN (1,2,3) 
GROUP BY restaurant_id HAVING(COUNT(*)) = 3 

结果如下图:
group by having结果图

  • 9
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值