比如有三张表 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的数量这样也可以解决,但是有没有更好的办法
select * from a where id in (select aid from c where bid in (select id from b where name in ('手表','电话')))
这样查是不行的,出来的是or条件不是and条件
@梦里的畅泳: 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: 恩还是group + count来实现的,主要是我现在有很多个查询条件,这样的话很不好维护SQL语句,暂时是用的列转行来解决的
如果不用子查询,我给你两个思路
其一:将纵表转换为横表,在做条件查询
这样做会涉及到临时表使用,如果新的类型物品出现,也不好扩展
其二:多次链接查询
这样做,会涉及到多个关联查询,并且不灵活,如果添加变化,关联次数也需要变化,也就是说需要动态生成sql语句
当然,还有就是子查询,子查询在语句实现上,是很简单的事,就不给你写具体的语句了
好的,我试试看