对于这些关系:
Customer(CID, Name, City, State),
Order(OID, CID, Date), and
Product(PID, ProductName, Price)
LineItem(LID, OID,PID, Number, TotalPrice),
其中CID是客户ID并且是Customer的密钥,OID是订单ID,是Order的密钥,LID是订单项ID,是LineItem的密钥。另外,Order的属性CID是引用Customer的CID的外键,也就是说,对于Order的每个CID c,恰好有一个Customer的CID属性为c的元组。 LineItem的OID是引用Order的OID的外键。同一订单有多个订单项,订单项指产品并包含产品订购数量。
查询是什么: 列出'mycity'所有客户购买的产品
@Edit 这是我到目前为止所尝试的:
Select ProductName
from Product
where PID in (
select PID
from LineItem
where OID in(
Select OID
from Order
where CID in(
select CID from customer where city='mycity'
)
)
);
然而,此查询将返回所有客户从mycity购买的所有产品。而这个问题只需要那些来自“mycity”的人购买的产品。
不确定如何实施“全部进入”条件
@ Edit2:终于解决了:)有人可以验证吗?
答案 0 :(得分:0)
SELECT ProductName FROM Product
INNER JOIN LineItem ON LineItem.PID=Product.PID
INNER JOIN `Order` ON Order.OID=LineItem.OID
INNER JOIN Customer ON Order.CID=Customer.CID
WHERE Customer.City='mycity'
我认为这应该有用
答案 1 :(得分:0)
此查询分为两部分:创建视图并查询该视图
Create view hview as (SELECT distinct count(distinct Customer.CID) as
uniquecustomer, count(distinct Customer.name), product.pid, product.Productname
FROM myorder
INNER JOIN Customer ON myorder.CID = Customer.CID
INNER JOIN LineItem ON myorder.OID = LineItem.oid
INNER JOIN Product ON Product.PID = LineItem.PID
where Customer.city = 'mycity'
group by Product.PID);
select productname from product where pid in(
select PID from hview where uniquecustomer in( SELECT count(distinct Customer.CID)
FROM myorder
INNER JOIN Customer ON myorder.CID = Customer.CID
INNER JOIN LineItem ON myorder.OID = LineItem.oid
INNER JOIN Product ON Product.PID = LineItem.PID
where Customer.city = 'mycity'));
使用的逻辑:使用mycity的不同所有者创建项目视图。 查询该视图以查找具有不同所有者的项目,这些项目等同于mycity中不同客户的数量。每个拥有不同数量的所有者的物品都与mycity的不同客户数相同,是mycity中每个人都购买的产品。
* myorder是我使用的表名而不是订单,因为这是一个保留字。
答案 2 :(得分:0)
单个查询中的更好版本:
select p1.productname from Product p1, myorder s1, lineitem l1, customer c1
where l1.pid=p1.pid
and l1.OID=s1.oid
and c1.cid=s1.cid
and c1.city='mycity'
group by p1.ProductName
having count(distinct c1.cid)=(select count(1) from customer c2 where c2.city='mycity');