用于检索数据的SQL查询

时间:2014-02-17 21:48:59

标签: mysql sql

对于这些关系:

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:终于解决了:)有人可以验证吗?

3 个答案:

答案 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');