选择具有多种产品的商店

时间:2019-04-13 13:50:05

标签: mysql

我有一个名为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';

所以我想从水果表中选择既有橘子和香蕉又有蔬菜表中的西红柿,胡萝卜和土豆的商店。

我该怎么做?

编辑

如果我想选择拥有的商店

  • 橙色
  • 一个或多个(香蕉,苹果梨)
  • 和番茄或胡萝卜

我该怎么做?

2 个答案:

答案 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 |