2013-02-17 108 views
1

我正在运行一个查询,我得到重复的行。我不明白这是为什么。这是我的查询:重复行SQL查询

SELECT c.FName, 
     p.ProductName, 
     s.Description, 
     s.Quantity, 
     s.Price 
FROM customers c, 
     products p, 
     sellers s, 
     requests r 
WHERE c.ID = s.CID 
     AND p.ProductID = s.ProductID 
     AND r.ProductID = s.ProductID 
     AND r.C_ID = 3 
     AND r.MatchType = 'Price' 
ORDER BY s.Price ASC 

======= =======编辑

好这里的编辑什么的请求表看起来像值。注:CID 2 = DAZ(通常为卖家),3 =保罗(一般为购买人),5 = compny1(通常为卖家) 注:产品ID 1 =苹果,产品ID 2 =梨,产品3 =浆果, ID4 =橙

请求表看起来是这样的选择记录后使用MatchType =价格和卡斯特ID = 3:

requestid | cid | productid | Quantity | Price | matchtype 
    ------------------------------------------------------------------ 
    1   3   1   3.0  2.00  price 
    3   3   4   4.0  2.50  price 
    4   3   3   2.5  2.00  exact 
    5   3   2   3.0  3.50  exact 
    6   3   3   3.0  2.00  exact 
    7   3   1   10.0 7.00  price 

,这里是卖家表

promotionID | cid | productid | Quantity | Price | description 
    ------------------------------------------------------------------ 
    1   2   4   5.0  2.99  oranges 
    2   2   3   1.5  1.00  hand strawberries   
    3   2   3   2.5  2.00  l stawberries 
    4   2   2   3.0  3.00  pear  
    5   5   1   5.0  5.00  royal apples fm appleco.   
    6   2   1   6.0  5.50   sweet apples 

运行后查询我我曾试过两个建议的连接和这个问题中的一个我一直在等待HIS作为输出

FName ProductName   Description   Quantity Price 

daz   Oranges  Fresh and sweet oranges. 5.0  2.99 
compny1  Apple  royal apples fm appleco. 5.0  5.00 
compny1  Apple  royal apples fm appleco. 5.0  5.00 
daz   Apple  sweet apples     6.0  5.50 
daz   Apple  sweet apples     6.0  5.50 

我不明白为什么我recieving被重复行。请求的产品ID必须=卖家产品id以匹配请求的产品到可用产品,并且在这种情况下选择的customerId是3 ...

我不明白为什么最后4条记录会重复它们自我吗?为什么这可能是?
从技术上讲只应显示4条记录。即行上的记录.. 1,2和3

建议/观察 OKay,看了这个......你认为行重复,因为productID1 = apple已被同一个客户请求两次不同的数量?

requestid | cid | productid | Quantity | Price | matchtype 
     ------------------------------------------------------------------ 
    1   3   1   3.0  2.00  price 

    7   3   1   10.0 7.00  price 
+0

也许这些产品在'requests'中有多个匹配项。 – 2013-02-17 22:27:19

+0

当您进行连接时,每个连接对都会显示出来,所以如果您加入了一个带有一个条目的表,并且该表的外部键有10行,那么答案将会有10行。 – 2013-02-17 22:37:32

+0

@MartinSmith 以及与客户ID 3请求表给出了以下请求:它们是由用户3请求的产品 巧克力,2公斤,2.00 choclate,10公斤,8.00 甜食,3千克,3.00 ....有两个供应商销售巧克力和甜食...... 1个供应商即compny1只销售一种产品choclate ..另一个供应商daz销售这两种产品。我只是不明白为什么最后4行重复他们自我? – johnny 2013-02-17 22:45:34

回答

1

您需要使用内部联接来“过滤”行。 试试这个:

select c.FName, p.ProductName, s.Description, s.Quantity, s.Price 
FROM requests r 
inner join sellers s on r.ProductID = s.ProductID 
inner join products p on p.ProductID=s.ProductID 
inner join customers c on c.ID=s.CID  
where r.C_ID = 3 AND r.MatchType='Price' 
ORDER BY s.Price ASC 

希望我没有任何错误,在这里(其后期在这里),但它的主要思想。 对于存在于两个表列,您希望使用的过滤使用内部连接, 从一个表筛选使用了条款。(该理论的一个分支)...

---编辑----

此查询可以显示的请求之间的胆怯......

select c.FName, p.ProductName, s.Description, s.Quantity, s.Price, r.demandid as 'Request ID' 
FROM requests r 
inner join sellers s on r.ProductID = s.ProductID 
inner join products p on p.ProductID=s.ProductID 
inner join customers c on c.ID=s.CID  
where r.C_ID = 3 AND r.MatchType='Price' 
ORDER BY r.demandid s.Price ASC 
+0

这似乎返回与地雷相同的结果:(2记录仍然重复:( – johnny 2013-02-17 22:55:45

+0

首先,你可以添加不同的选择后,但它不会“完全解决”的问题..它只是一个工作......你在这个问题上试图问什么? – 2013-02-17 23:03:41

+0

哇是的,这是一个工作...好吧,我问这个问题的全部目的是因为我有一个小问题,如果你没问题,我问过这里的问题更详细: [链接](http://forums.devshed.com/mysql-help-4/mysql-help-fulfil-customer-requests-940049.html#post2856610) 也在这里[链接] http://stackoverflow.com/questions/14915675/fulfilling-quantity-required-using-mysql 如果你愿意,你可以阅读第一个链接,然后阅读第二个链接。 ays就可以了,我无法找到它:( – johnny 2013-02-17 23:09:13

0
select c.FName, p.Name, s.Description, s.Quantity, s.Price 
FROM customers c 
left join sellers s on c.ID = s.cid 
left join requests r on r.ProductID = s.ProductID 
left join products p on p.productid = s.productid 
where r.C_ID = 1 
AND r.MatchType='Price' 
ORDER BY s.Price ASC 

我设置它SQL Fiddle并加送一些虚拟数据小提琴,代码工作,如果我正确设置数据。

+0

感谢您的回复。我已经尝试过,仍然是重复的行。我编辑了显示我的表格的问题。如果这有助于解释为什么? – johnny 2013-02-18 17:31:36

+0

正如我对前面的评论者所说的那样。没关系,所以我认为我的编辑解释了为什么该行正在重复它,因为同一个客户已经请求了两次不同数量的产品。所以,不可避免的,它会匹配第一次请求(1)和第二次再次(requestid = 7)...有一种方法,但是,如果客户确实下了两次订单,那么它只会显示一次匹配?我想我将不得不使用不同的权利? – johnny 2013-02-18 20:39:06

+0

我的问题是,您为什么要隐藏客户的活动订单?在应用程序中应该有一些关键约束或代码来防止重复条目。请记住,您的数据库依靠这些检查和平衡来确保数据的完整性。没有它们,你的数据库会被垃圾数据臃肿,你永远不会知道哪一个是实际的请求,哪一个不是。 – 2013-02-19 02:34:32