2015-04-02 102 views
1
SELECT ai.auction_item_id, ai.starting_bid, b.bid_amount, i.* 
    FROM 
    auction_item as ai, //Table contains auction specific details about the item 
    item as i //Table contains general details about the item 
    INNER JOIN (
      SELECT auction_item_id, bid_amount 
      FROM bid xb //Table contains bids on item 
      ORDER BY amount DESC 
      LIMIT 1) b 
    ON b.auction_item_id = ai.auction_item_id 
    WHERE 
    ai.auction_id = 4 AND 
    i.id = ai.listings_id 

    ORDER BY RAND() 
    LIMIT 4 

當前使用上述查詢,我​​可以從當前活動拍賣(拍賣#4)中獲得4個隨機項目。但他們目前都以相同的最高出價金額(來自內部聯合)回來。每個項目應該有自己的最高出價金額(來自內部加入) - 除非該項目沒有出價,那麼它應該是0(或某物)簡單的SQL內部聯接查詢 - 無法正常工作

我在做什麼錯在這裏? 由於我希望外部部分中的每件商品的最高出價,因此投標表對於放置的每個出價都有一行,因此LIMIT 1和內部聯合中的desc順序排列。 (如果出價是)。

謝謝

+0

目前,只有10個項目的1具有投標 - 所以我認爲,任何項目沒有投標只是越來越即1項與出價最高的出價。所以如果在內部聯接中沒有出價,它需要返回0。我認爲這可能是解決方案,也許 – Martin 2015-04-02 04:46:44

+0

劃痕,即使另一個項目有出價 - 它只是拉出現有的最高出價,並使用所有項目(甚至有出價的項目):( – Martin 2015-04-02 04:50:27

+0

你的內部連接表沒有提及所以它只是爲所有(外部)項目獲得相同的max bid_amount。目前正在測試一個可能的解決方案 – Hockenberry 2015-04-02 05:07:38

回答

2

嘗試一個子查詢。如果由於​​3210而在投標表中沒有條目,則您創建0

SELECT 
    ai.auction_item_id, ai.starting_bid, 
    Coalesce((SELECT max(xb.bid_amount) 
       FROM bid xb 
       WHERE xb.auction_item_id = ai.auction_item_id), 0) AS bid_amount, 
    i.* 
FROM auction_item AS ai 
INNER JOIN item AS i ON i.id = ai.listings_id 
WHERE ai.auction_id = 4 
ORDER BY Rand() 
+0

子查詢不必要地過度複雜化可以通過簡單的加入和彙總執行的操作 – 2015-04-02 05:17:34

+0

我收到一個錯誤:#1054 - '字段列表'中的未知列'bid_amount' – Martin 2015-04-02 05:27:11

+0

哎呀。忘了MySql不知道'fieldName ='語法。它現在正在使用正確的「AS bid_amount」。 – Hockenberry 2015-04-02 05:37:21

1

像這樣?

SELECT ai.auction_item_id, ai.starting_bid, b.bid_amount, max(bid_amount) 
    FROM auction_item as ai 
     inner join bid b 
     on ai.auction_item_id = b.auction_item_id 
     inner join items i 
     on i.id = ai.listings_id 
    where ai.auction_id = 4 

將您的表架構的問題將有助於

編輯

SELECT ai.auction_item_id, ai.starting_bid, IFNULL(max(bid_amount), 0) max_bid 
     FROM auction_item as ai 
      left join bid b 
      on ai.auction_item_id = b.auction_item_id 
      inner join items i 
      on i.id = ai.listings_id 
     WHERE ai.auction_id = 4 
     GROUP BY ai.auction_item_id 

在這裏你去,包括未投標的項目。

讓我知道,如果我有錯小提琴:http://sqlfiddle.com/#!9/0eae7/2

+0

謝謝,這隻會拉出最高出價的物品。 我需要列出所有物品(在拍賣4中),包括它們各自的最高出價(如果沒有高出價,則爲0) – Martin 2015-04-02 05:02:34

+0

@Martin是否符合要求? – 2015-04-02 05:12:11

+0

謝謝,但編輯仍然只是拉出有出價的物品 - 但正確地做到了這一點。任何沒有出價的項目(出價表中都沒有)被忽略。 – Martin 2015-04-02 05:23:50

1

有幾個問題:

  • 按Hockenberry,交叉連結到派生表LIMIT 1每次都會重複剛纔的出價最高,更糟的是,它沒有被過濾,所以它將是任何拍賣的最高出價,如果該行不是針對當前的auction_item_id,那麼它將被連接。將LIMIT移動到外部查詢。
  • 即使沒有出價,您也會希望使用LEFT JOIN返回一行。
  • 您還需要INNER JOINauction_itemitem(您最初的查詢將無法運行)
SELECT ai.auction_item_id, ai.starting_bid, COALESCE(b.bid_amount,0)如BID_AMOUNT, 島* FROM auction_item艾 INNER JOIN 項作爲我 ON i.id = ai.listings_id LEFT JOIN( SELECT auction_item_id,BID_AMOUNT FROM出價XB ORDER BY量DESC)b ON b.auction_item_id = ai.auction_item_id WHERE ai.auction_id = 4 ORDER BY RAND() LIMIT 4; [SqlFiddle here](http://sqlfiddle.com/#!9/28922/1)

編輯

道歉,起初,我不明白你試圖實現。如果你只想要拍價最高(或零,如果沒有出價)任何4個隨機auction_items,這裏要做到這一點的一種方式,用2個派生表:

  • 確定4個隨機項目
  • 查找的最高價每個auction_items
  • LEFT JOIN兩個派生表一起

SELECT items.auction_item_id, IFNULL(topBids.amount, 0) as topBid 
FROM 
(SELECT auction_item_id 
    FROM auction_item 
    ORDER BY RAND() 
    LIMIT 4 
) items 
LEFT JOIN 
    (SELECT b.auction_item_id, b.amount 
    FROM bid b 
    GROUP BY b.auction_item_id 
    ORDER BY amount DESC) topBids 
ON items.auction_item_id = topBids.auction_item_id; 

Updated Fiddle

+0

這是如何關閉?他想要每個拍賣項目的最高出價,並且您的小提琴的第一個結果顯示單個拍賣項目4次? – 2015-04-02 05:32:13

+0

我正在閱讀OP的代碼,而不是他的要求。我最初誤解了他的要求,因爲任何一件物品都有4次競標('ai。auction_id = 4')。編輯解決了OP的評論' - 我需要拍賣中的4件隨機物品 - 以及他們的最高出價 – StuartLC 2015-04-02 05:50:17