一个 MYSQL 并集 的问题。

一个 MYSQL 并集 的问题。

昨天遇到一个看似很简单的SQL语句(多对多关系的)[基于MYSQL]。

我问了我认识的所有计算机专业人士、若干研究生,没人会解。
后来加了12个技术群,其中三个技术群的人,总计二十人讨论了两个多小时,无解。

我觉得这个问题不难,并且有可行的解决方案!需求是这样:

数据库结构:
user_name product_id
1            A
2            B
1            B
3            C
4            C
1            C

需求:哪些用户同时购买了 A,C,D?(或者说,同时购买A,C,D的用户都是那些?)
A,C,D是用户临时输入的,每次都确定、但不固定。


今天早晨起床,还是没有想到解决方案,于是我决定修改需求

就在这时候,我忽然想起来,我一好友 http://t.qq.com/chuwey,他一直为银行的数据库写SQL。

我打电话过去,大概说了我的要求,并渲染了一下这道题目很多人都没做出来,比较难,并且很多人建议我用正则,或者临时表等来解决。
他沉思了5秒钟,疑惑的说:“不需要那么复杂啊,你这个需求很简单,就是一个简单的求交集的问题,还是一个表之内的,一句SQL就可以解决。这样,我现在就短信发给你。”

于是就有了下面的SQL。

 

文本标记一下:

SELECT user_name
FROM product_buy
WHERE product_id in( 13834720379 , 2222485585 )
GROUP BY user_name
HAVING COUNT( DISTINCT product_id ) = 2 ;


后来,微博好友 http://t.qq.com/jcifox 也发来一种思路,共享一下。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值