0

这是我正在尝试编写的查询:

SELECT I.*, 
       IF(MAX(B.`amount`) != 0, MAX(B.`amount`), I.`start`) AS `current_bid`, 
       `current_bid` * 1.05 AS `min_bid`
       ...

我收到错误“未知列'current_bid'”。我假设这是因为我刚刚在之前的行中创建了当前列。无论如何我可以让这个查询按我想要的方式工作吗?我想让它工作的一种方法是使用两个 if 语句,它们说的基本相同,如下所示:

SELECT I.*, 
       IF(MAX(B.`amount`) != 0, MAX(B.`amount`), I.`start`) AS `current_bid`, 
       IF(MAX(B.`amount`) != 0, MAX(B.`amount`) * 1.05, I.`start` * 1.05) AS `min_id`
       ...

但这似乎非常低效。

current另外,有没有一种方法可以在不计算MAX(B.amount)两次的情况下分配?

4

2 回答 2

2
SELECT
    C.CURRENT_BID,
    C.CURRENT_BID * 1.05 AS MIN_BID
FROM
    (
        SELECT MAX(B.AMOUNT) AS CURRENT_BID FROM ...
    ) C

我很确定嵌套查询会首先执行,以便您可以使用它们的结果。而同一查询中的不同列被视为并发,因此您不能使它们相互依赖。

于 2012-04-09T05:48:38.180 回答
0

您不能引用current_bid另一列中的任何别名列。有两种方法可以继续:

  1. 每当您想使用该值时,您都可以复制整个计算(最有效,可读性较差)
  2. 您使用派生表(效率较低,可读性更高)

在后一种情况下,您应该执行以下操作:

select current_bid from (
    IF(MAX(B.`amount`) != 0, MAX(B.`amount`), I.`start`) AS `current_bid`...
) s

我想强调派生表将对所有行执行扫描,这样效率会降低。大多数时候最好复制公式。

PS:如果你选择第一个选项,请注意你可以IF这样写你的第二个:

IF(MAX(B.`amount`) = 0, I.`start`, MAX(B.`amount`)) * 1.05 `min_id`

这更具可读性。

于 2012-04-09T05:51:12.793 回答