2013-02-17 106 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