【问题标题】:How do I set ORDER BY in SQL query to a value depending by the SQL query itself?如何将 SQL 查询中的 ORDER BY 设置为取决于 SQL 查询本身的值?
【发布时间】:2011-07-23 18:35:07
【问题描述】:

想象一下拍卖(例如,ebay 拍卖)。您创建一个拍卖,设置起始出价值,比如说 5 美元。这将作为最低出价值存储到auctions 表中。此时,此拍卖的当前出价值为5 美元

现在,如果有人对您的拍卖出价,比如 10 美元,这将存储到 bids 表中。此时,此拍卖的当前出价值为 10 美元

现在让我们假设您要检索 5 个最便宜的拍卖。您将编写如下查询:

SELECT
`auction_id`,
`auction_startPrice`,
MAX(bids.bid_price) as `bid_price`
FROM
`auctions`
LEFT JOIN `bids` ON `auctions`.`auction_id`=`bids`.`bid_belongs_to_auction`
GROUP BY `auction_id`
LIMIT 5

很简单,而且很有效!但是现在您需要在查询中添加一个ORDER BY 子句。然而,问题是,我们希望通过auctions.auction_startPrice 通过ORDER BY 要么 bid_price,这取决于哪个更高 strong>,如第一段所述。

这可以理解吗?我知道如何使用 2 个查询来做到这一点,但我希望它可以用 1 个查询来完成。

谢谢!

编辑:只是进一步解释以帮助您想象问题。如果我设置ORDER BY auction_startPrice ASC,那么我将获得 5 个最低初始出价的拍卖,但是如果这些拍卖已经有出价怎么办?那么他们当前的最低价格等于那些出价,而不是起始价格,因此我的查询是错误的。

【问题讨论】:

  • 但是由于bid_price 总是高于或等于auction_startPrice,为什么不直接按bid_price 排序呢? (或 isnull(bidprice,auction_startPrice) 如果还没有任何出价(
  • bid_price 如果还没有出价,则不存在,因此我无法按出价订购,因为在某些情况下它为 NULL

标签: sql


【解决方案1】:
SELECT
  `auction_id`,
  `auction_startPrice`,
  `bid_price`
FROM
(
    SELECT
        `auction_id`,
        `auction_startPrice`,
        MAX(bids.bid_price) as `bid_price`,
        IF(MAX(bids.bid_price)>`auction_startPrice`,
           MAX(bids.bid_price),
           `auction_startPrice`) higherPrice
    FROM
    `auctions`
    LEFT JOIN `bids` ON `auctions`.`auction_id`=`bids`.`bid_belongs_to_auction`
    GROUP BY `auction_id`
) X
order by higherPrice desc
LIMIT 5;

注意:

  1. 在内部查询中,创建了一个额外的列,名为“higherPrice”
  2. IF 函数将MAX(bid_price) 列与startprice 进行比较,并且仅当 Max-bid 不为空(在比较中隐含要求)且大于起始价格时,Max-bid 才成为higherPrice 专栏。否则,它将包含起始价格。
  3. 外部查询仅使用内部查询中的列,按higherPrice 排序

【讨论】:

  • 这看起来很有趣,乍一看,我认为您理解我的问题。我将立即尝试并尽快报告。
  • 先生,我很伤心,我不明白你是怎么做到的,但它工作得很好。非常感谢,希望有一天我也会得到它:)
  • 那么X 在那里做什么?这是什么意思?就像 FROM () as X 的缩写?只是一个包含结果的占位符?
  • @RiMMER - 完全正确。 (.. some query..) AS X(AS 这个词是可选的)意味着您现在可以引用查询生成的数据,就好像它是一个名为“X”的表一样
  • 只是子查询的名称。如果您查看分析器,它会使用“内部”查询创建一个临时表,然后使用“外部”查询进行查询。
【解决方案2】:

我不确定您使用的是哪个数据库,但请查看examplehttp://www.extremeexperts.com/sql/articles/CASEinORDER.aspx

SELECT
`auction_id`,
`auction_startPrice`,
MAX(bids.bid_price) as `bid_price`
FROM
`auctions`
LEFT JOIN `bids` ON `auctions`.`auction_id`=`bids`.`bid_belongs_to_auction`
GROUP BY `auction_id`
ORDER BY CASE WHEN `auction_startPrice` > isnull(MAX(bids.bid_price),0) then `auction_startPrice` else MAX(bids.bid_price) end
LIMIT 5

【讨论】:

  • 您可能需要处理 MAX(bids.bid_price) 为 NULL 的情况。
  • 你说得对,我想过这个问题,但没有将其添加到我的答案中,因为我很懒。我现在就补充。
  • 或者 WHEN MAX(bids.bid_price) >= auction_startPrice 当 MAX(bids.bid_prices) 为 NULL 时也会失败...
猜你喜欢
  • 1970-01-01
  • 2019-01-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-17
  • 2010-11-02
相关资源
最近更新 更多