2015-04-02 52 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