你可以在SELECT中分配一个变量,然后在同一个SELECT中使用它吗?

时间:2012-04-09 05:42:42

标签: mysql alias

这是我要写的一个查询:

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)

2 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:0)

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

  1. 只要您想使用该值(效率最高,可读性较低),就可以复制整个计算
  2. 您使用派生表(效率更低,更易读)
  3. 在后一种情况下,您应该执行以下操作:

    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`
    

    哪个更具可读性。