2012-01-31 33 views
3

好吧,所以我得到了一個人的表。一張帶有物品的桌子,另一張帶有人們想要的物品。用於匹配賣家和買家的SQL查詢

People: 
Person_ID, Name 

Giveaways: 
Person_ID, Item_ID 

Wishlist: 
Person_ID, Item_ID 

所以我想要一個查詢,返回某個用戶的交換建議。

因此,如果我想交換人A的建議,它應該返回一個人的名單,這些人正在贈送一個人需要的物品,並且需要一個人A正在贈送的物品。 結果應該包括:人員A的項目,人員的名字也與id和item_ID交換。

回答

1

@SérgioMichels的回答應該是正確的。但它沒有得到賣家的名字,並且它使用應該(在我看來)應該避免的語法。

所以,這裏是一個替代...

SELECT 
    buyer.name   AS buyer, 
    buyerWants.name  AS buyer_wants,  (assuming the items have names), 
    buyerHas.name  AS buyer_has, 
    seller.name   AS seller, 
    sellerWants.name AS seller_wants, 
    sellerHas.name  AS seller_has 
FROM 
    People    AS buyer 
INNER JOIN 
    Wishlist   AS buyerWants 
    ON buyerWants.person_id = buyer.person_id 
INNER JOIN 
    Giveaways   AS sellerHas 
    ON sellerHas.item_id = buyerwish.item_id 
INNER JOIN 
    People    AS seller 
    ON seller.person_id = sellerHas.seller_id 
INNER JOIN 
    WishList   AS sellerWants 
    ON sellerWants.person_id = seller.person_id 
INNER JOIN 
    GiveAways   AS buyerHas 
    ON buyerHas.item_id = sellerWants.item_id 
    AND buyerHas.person_id = buyer.person_id 
WHERE 
    buyer.person_id = ? 
+0

謝謝!但似乎這會返回所有正在贈送用戶想要的物品的人。不僅那些也想要一個用戶正在贈送的物品.. – LarsJK 2012-02-02 13:00:04

+0

你可以添加到你的答案爲什麼應該避免sintax?在我的工作中,我們認爲閱讀好得多,我們知道這不會改變性能(至少在Oracle中)。謝謝。 – 2012-02-02 13:50:52

+0

@SérgioMichels - 這是一段長時間的談話,我甚至確定這裏有關於SO的問題。我的'short'(ish)答案是......(技術)在實現多個內部/外部聯接時,外部聯接表示法會導致它不明確。 (演示文稿)理解複雜的ANSI-92通常比舊的符號更容易理解。這使得它更容易維護和調試。 ',''notation * * *通常更緊湊,特別是對於簡單的查詢。但是最糟糕的情況往往比ANSI-92最壞的情況差得多。 – MatBailie 2012-02-02 16:55:56

0

我認爲你需要的是這樣的:

select p.* 
    , w.item_id item_wanted 
    , g.person_id person_giveaway 
    from People p 
    , Wishlist w 
    , Giveaways g 
where p.person_id = ? 
    and p.person_id = w.person_id 
    and g.person_id != p.person_id 
    and g.item_id = w.item_id 
    and exists(select 1 
       from Wishlist w1 
        , Giveaways g1 
       where g1.person_id = p.person_id 
        and g1.item_id = w1.item_id 
        and w1.person_id = g.person_id) 
+0

謝謝!但似乎這會返回所有正在贈送用戶想要的物品的人。不僅那些也想要用戶贈送的物品.. – LarsJK 2012-02-02 13:00:17

+0

@LarSaronen看到我的編輯。我添加一個exists子句。 – 2012-02-02 13:49:16

+0

-1:如果使用JOIN語句並避免使用子查詢(如果不需要的話),這被認爲是最佳實踐。請嘗試促進更好的編碼實踐(請參閱Dems的帖子)。 – 2012-02-02 16:29:09

0
select 
     AllGiveWish.WhichWay, 
     AllGiveWish.Item_ID, 
     p1.Name as MainPersonName, 
     p2.Name as OtherPersonName 
    from 
     (select 
       "Give" as WhichWay, 
       G.Item_ID, 
       G.Person_ID as MainPerson, 
       W.Person_ID as OtherPerson 
      from 
       GiveAways G 
       JOIN WishList W 
        on G.Item_ID = W.Item_ID 
      where 
       G.Person_ID = YourSinglePersonParm 
     UNION ALL 
     select 
       "Wish" as WhichWay, 
       W.Item_ID, 
       W.Person_ID as MainPerson, 
       G.Person_ID as OtherPerson 
      from 
       WishList W 
       JOIN GiveAways G 
        on W.Item_ID = G.Item_ID 
      where 
       W.Person_ID = YourSinglePersonParm) As AllGiveWish 

     join People P1 
      on AllGiveWish.MainPerson = P1.Person_ID 

     join People P2 
      on AllGiveWish.OtherPerson = P2.Person_ID 
相關問題