首页 新闻 搜索 专区 学院

SQL查询求助

0
悬赏园豆:20 [已解决问题] 解决于 2020-02-15 17:37

比如有三张表 A :用户表 B:物品表 C:用户物品表(存放用户ID和物品ID)

比如现在物品表里面有 手表、电话、电脑

现在我想查询出同时拥有 手表和电话的用户

1、请问这种SQL语句怎么写?
2、我这样设计表有没有问题?
3、我现在的语句是这样写的:
SELECT * FROM a INNER JOIN c ON a.Id = c.aid INNER JOIN b ON b.Id = c.bid
WHERE b.Name IN ('手表','电话') 这样写的出来的数据不行,用 b.Name = '手表' AND
b.Name = '电话' 这样显然也是不行的

4、子查询是可以的,但是这个需求只能用子查询吗?那如果我想查询更多的物品,不是要嵌套更多的子查询吗
5、用count group by A的ID 然后 HAVING count的数量这样也可以解决,但是有没有更好的办法

梦里的畅泳的主页 梦里的畅泳 | 初学一级 | 园豆:159
提问于:2020-02-06 23:55
< >
分享
最佳答案
0

select * from a where id in (select aid  from c where bid in (select id from b where name in ('手表','电话')))

收获园豆:10
sunkejava | 初学一级 |园豆:196 | 2020-02-07 11:47

这样查是不行的,出来的是or条件不是and条件

梦里的畅泳 | 园豆:159 (初学一级) | 2020-02-07 19:34

@梦里的畅泳: SELECT * FROM a WHERE id IN (SELECT aid  FROM c WHERE bid IN (SELECT id FROM b WHERE NAME IN ('手表','电话')) GROUP BY aid HAVING COUNT(aid) = 2)

sunkejava | 园豆:196 (初学一级) | 2020-02-12 20:45

@sunkejava: 恩还是group + count来实现的,主要是我现在有很多个查询条件,这样的话很不好维护SQL语句,暂时是用的列转行来解决的

梦里的畅泳 | 园豆:159 (初学一级) | 2020-02-15 17:37
其他回答(1)
0

如果不用子查询,我给你两个思路
其一:将纵表转换为横表,在做条件查询
这样做会涉及到临时表使用,如果新的类型物品出现,也不好扩展
其二:多次链接查询
这样做,会涉及到多个关联查询,并且不灵活,如果添加变化,关联次数也需要变化,也就是说需要动态生成sql语句

当然,还有就是子查询,子查询在语句实现上,是很简单的事,就不给你写具体的语句了

收获园豆:10
程序员修炼之旅 | 园豆:702 (小虾三级) | 2020-02-07 14:28

好的,我试试看

支持(0) 反对(0) 梦里的畅泳 | 园豆:159 (初学一级) | 2020-02-07 19:35
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册