是的,您需要两个查询的目录,因为这是将您的供应商和产品联系在一起的共同点。
我可能想多了。这是我的思路。
结构
create table suppliers (sid int, sname text, address text);
create table parts (pid int, pname text, color text);
create table catalog (sid int, pid int, cost int);
insert into suppliers values (1, 'walmart', ''), (2, 'target', ''), (3, 'amazon', '');
insert into parts values (1, 'ball', 'black'), (2, 'ball', 'white'), (3, 'bat', 'black'), (4, 'bat', 'white');
insert into catalog (sid, pid) values (1, 1), (1, 2), (1, 3), (2, 1), (3, 2);
选择所有黑色部分
select group_concat(pid) as gc from parts p where p.color = 'black';
gc
------
1,3
选择供应商出售的所有黑色零件
select c.sid, group_concat(c.pid) as gc
from catalog c inner join parts p on c.pid = p.pid and p.color = 'black'
group by c.sid;
sid gc
----- ------
1 1,3
2 1
寻找供应所有黑色零件的供应商
select s.sname
from (
select c.sid, group_concat(c.pid) as gc
from catalog c inner join parts p on c.pid = p.pid and p.color = 'black'
group by c.sid
) a
inner join (
select group_concat(pid) as gc
from parts p where p.color = 'black'
) b on a.gc = b.gc
inner join suppliers s on a.sid = s.sid
sname
--------
walmart
与上述类似,您的第二个查询也必须更改为以下内容:
第二次查询
select distinct s.sname
from catalog c
inner join parts p on c.pid = p.pid and p.color = 'black'
inner join suppliers s on c.sid = s.sid
sname
--------
walmart
target
在上面的查询中,我们将目录与零件结合起来,得到所有有黑色零件的目录。然后我们将结果与供应商结合起来得到供应商的名称。如果供应商提供不止一个黑色部件,他们的信息可能会出现不止一次。因此,我们使用 distinct 来获得不同的名称。
示例:http://rextester.com/IDH97131