如何将SQL查询中的ORDER BY设置为一个取决于SQL查询本身的值?
想象一场拍卖(例如ebay拍卖)。您创建一个拍卖,设置开始竞价值,比如说,5美元。这将作为最低出价值存储到如何将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
拍卖
表中。此时,此拍卖的当前出价值为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