昨天遇到一个看似很简单的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 也发来一种思路,共享一下。