如何将SQL查询中的ORDER BY设置为一个取决于SQL查询本身的值?

如何将SQL查询中的ORDER BY设置为一个取决于SQL查询本身的值?,sql,Sql,想象一场拍卖(例如ebay拍卖)。您创建一个拍卖,设置开始竞价值,比如说,5美元。这将作为最低出价值存储到拍卖表中。此时,此拍卖的当前出价值为5美元 现在,如果有人对您的拍卖出价,比如说,10美元,这将存储到bids表中。此时,此拍卖的当前出价值为10美元 现在,让我们假设您想要检索5个最便宜的拍卖。您将编写如下查询: SELECT `auction_id`, `auction_startPrice`, MAX(bids.bid_price) as `bid_price` FROM `aucti

想象一场拍卖(例如ebay拍卖)。您创建一个拍卖,设置开始竞价值,比如说,5美元。这将作为最低出价值存储到
拍卖
表中。此时,此拍卖的当前出价值为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
非常简单,而且很有效!但是现在需要向查询中添加一个
orderby
子句。然而,问题是,我们希望通过
拍卖
订购。拍卖开始价
出价
,取决于两者中较高者,如前几段所述

这是可以理解的吗?我知道如何使用2个查询来实现这一点,但我希望可以使用1个查询来实现

谢谢

编辑:只是一个进一步的解释来帮助你想象问题。如果我通过拍卖设置订单(u startPrice ASC)
,那么我将获得5次最低初始出价的拍卖,但如果这些拍卖中已经有出价呢??那么他们当前的最低价格等于那些出价,而不是起始价,因此我的查询是错误的

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;
注:

  • 在内部查询中,会创建一个额外的列,名为“higherPrice”
  • IF函数将
    MAX(bid_price)
    列与
    startprice
    进行比较,并且仅当MAX bid不为null(在比较中隐式要求)且大于起始价格时,MAX bid才成为
    higherPrice
    列中的值。否则,它将包含起始价格
  • 外部查询仅使用内部查询中的列,按
    更高的价格排序

  • 我不确定您正在使用哪个数据库,但请看以下内容:


    但既然出价总是高于或等于拍卖起始价,为什么不直接按出价下单呢?(如果还没有任何出价,则为空(投标价、拍卖开始价)(如果还没有出价,出价就不存在,所以我不能按出价订购,因为在某些情况下它是空的。这看起来很有趣,从第一眼看,我想你理解我的问题。我将立即试用并很快报告。先生,我很难过,我不明白你是如何做到这一点的,但它工作得很完美。非常感谢,何pefully我总有一天也会得到它:)那么,
    X
    在那里做什么?它是什么意思?就像是
    FROM()的缩写X
    ?只是一个包含结果的占位符?@RiMMER-没错。
    (…一些查询…)作为X
    (as这个词是可选的)这意味着您现在可以引用查询生成的数据,就像它是一个名为“
    X
    ”的表一样。它只是子查询的名称。如果您查看探查器,它会使用“内部”查询生成一个临时表,然后使用“outter”查询从中进行查询。您可能需要处理MAX(bids.bid\u price)的情况是空的。你是对的,我考虑过这个问题,但没有把它添加到我的答案中,因为我很懒。我现在添加。或者当MAX(bids.bid\u price)为空时,
    或者当MAX(bids.bid\u price)为空时,
    也会失败。。。
    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