我有一个名为store
的表和一个名为products
的表。
数据的结构如下:
Store table
ID NAME
1, 'red fruit store';
2, 'blue fruit store';
3, 'orange fruit store';
Fruits table
ID STORE_ID PRODUCT_NAME
1, 1, 'orange';
2, 1, 'apple';
3, 1, 'banana';
4, 2, 'apple';
5, 3, 'banana';
6, 3, 'pear';
Vegetables table
ID STORE_ID PRODUCT_NAME
1, 1, 'tomato';
2, 1, 'carrot';
3, 1, 'potato';
4, 2, 'cabbage';
5, 3, 'tomato';
6, 3, 'carrot';
所以我想从水果表中选择既有橘子和香蕉又有蔬菜表中的西红柿,胡萝卜和土豆的商店。
我该怎么做?
编辑
如果我想选择拥有的商店
我该怎么做?
答案 0 :(得分:2)
如果您希望商店同时拥有这两种产品(至少),则可以使用几个内部联接
SELECT s.id AS store_id,
s.name AS store_name
FROM store AS s
INNER JOIN Products p1 ON p1.STORE_ID = s.ID AND p1.PRODUCT_NAME = 'orange'
INNER JOIN Products p2 ON p2.STORE_ID = s.ID AND p2.PRODUCT_NAME = 'banana'
您查询失败,因为两个产品都没有一行,所以AND失败
如果您希望商店中至少包含两种产品中的一种,则可以使用左联接
或者您可以使用按商店分类的产品类别
SELECT s.id AS store_id,
s.name AS store_name
FROM store AS s
INNER JOIN (
select STORE_ID
from Products where PRODUCT_NAME IN ('orange','banana' )
group by STORE_ID
having count(distinct PRODUCT_NAME ) = 2
)
答案 1 :(得分:1)
您需要在表之间使用join
,结果的条件如下:
product_name in ('banana', 'orange')
然后group by s.id, s.name
仅获取同时具有“香蕉”和“橙色”的商店:
select s.id, s.name
from store s inner join product p
on p.store_id = s.id
where p.product_name in ('banana', 'orange')
group by s.id, s.name
having count(*) = 2
如果您需要检查更多产品,则必须将用in
检查的列表和having count(*) = ?
的数量更改为准确个项目的数量在列表中。
获得所需结果的另一种方法是使用EXISTS:
select s.* from store s
where
exists (
select 1 from products
where store_id = s.id and product_name = 'orange'
)
and
exists (
select 1 from products
where store_id = s.id and product_name = 'banana'
)
修改
对于您编辑的问题:
select s.id, s.name
from store s
inner join fruits f on f.store_id = s.id
inner join vegetables v on v.store_id = s.id
where
f.product_name in ('banana', 'orange')
and
v.product_name in ('tomato', 'carrot', 'potato')
group by s.id, s.name
having
count(distinct f.id) = 2
and
count(distinct v.id) = 3
请参见demo。
结果:
| id | name |
| --- | --------------- |
| 1 | red fruit store |