【问题标题】:Simple SQL inner join query - can't get working简单的 SQL 内连接查询 - 无法正常工作
【发布时间】:2015-04-03 01:13:21
【问题描述】:
    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(或其他东西)

我在这里做错了什么? 出价表对于每个出价都有一行,因此 LIMIT 1 并在内部连接中按 desc 排序,因为我想要外部部分中每个项目的最高出价。 (如果有出价的话)。

谢谢

【问题讨论】:

  • 目前 10 件商品中只有 1 件有出价 - 所以我认为任何没有出价的商品都会获得 1 件有出价的商品的最高出价。因此,如果该内部连接中没有出价,它需要返回 0。我认为这可能是解决方案
  • 从头开始,即使另一个项目有出价 - 它只是拉出现有的最高出价并将其用于所有项目(即使是有出价的项目):(
  • 您的内部连接表没有对外部表的引用,因此它只会为您提供所有(外部)项目的相同最大bid_amount。目前正在测试一种可能的解决方案。
  • 是的,我在想一些类似的事情 - 认为这就是我虽然“ON b.auction_item_id = ai.auction_item_id”正在做的事情。
  • on 后面的所有内容都是表格之间的链接。但是您的表本身没有参考外部。单独使用出价表运行查询并查看结果。您会在整个出价表中获得最大金额的一行。

标签: mysql sql


【解决方案1】:

尝试子查询。如果由于coalesce 而在出价表中没有条目,您将获得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()

【讨论】:

  • 子查询不必要地过度复杂化了可以通过简单的连接和聚合执行的操作
  • 我收到一个错误:#1054 - 'field list' 中的未知列 'bid_amount'
  • 哎呀。忘记了 MySql 不知道 fieldName = 语法。 Its now working with the right AS bid_amount`.
  • 这就是我认为的问题所在。是的,效果很好。
【解决方案2】:

这样的?

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

【讨论】:

  • 谢谢,这只会拉出出价最高的项目。我需要列出的所有物品(在拍卖 4 中),包括它们各自的最高出价(如果没有高出价,则为 0)
  • @Martin 已满足要求?
  • 谢谢,但编辑仍然只提取有出价的项目 - 但这样做是正确的。任何没有出价的项目(出价表中没有任何内容)都将被忽略。
  • 我在小提琴中的数据结构与你的有何不同?在小提琴中,它成功显示了有两个出价的项目,以及没有出价的项目
  • 请问您是否看过我的小提琴 - 结果就是您想要的结果?与使用连接的答案相比,使用子查询的答案几乎总是次优
【解决方案3】:

有几个问题:

  • 根据 Hockenberry,使用 LIMIT 1 交叉连接到派生表只会重复每次最高出价,更糟糕的是,它没有被过滤,因此它将是 任何 的最高出价> 如果该行不是当前auction_item_id,则将加入拍卖。将 LIMIT 移至外部查询。
  • 即使没有出价,您也需要使用LEFT JOIN 返回一行。
  • 您还需要将INNER JOIN auction_item 转至item(您的初始查询不会运行)
选择 ai.auction_item_id, ai.starting_bid, COALESCE(b.bid_amount, 0) 作为bid_amount, 一世。* FROM auction_item as ai 内部联接 我的项目 ON i.id = ai.listings_id 左连接( 选择拍卖项目编号、出价金额 FROM 出价 xb 按数量 DESC 订购)b ON b.auction_item_id = ai.auction_item_id 在哪里 ai.auction_id = 4 兰德订购() 限制 4; [这里是SqlFiddle](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

【讨论】:

  • 怎么接近?他想要每个拍卖品的最高出价,而你小提琴的第一个结果显示了一个拍卖品 4 次?
  • 我正在阅读 OP 的代码,而不是他的要求。我最初将他的要求误解为对单个项目的任何 4 个投标 (ai.auction_id = 4)。编辑解决了OP的评论- I need 4 random items in the auction - and their highest bids
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多