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'」というエラーが発生します。前の行に現在の列を作成したばかりだからだと思います。とにかく、このクエリを希望どおりに機能させることができますか?それを機能させる1つの方法は、次のように、基本的に同じことを言う2つの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`
       ...

しかし、それはひどく非効率的なようです。

また、 2回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別の列でエイリアス化された列を参照したり、別名を付けたりすることはできません。続行するには 2 つの方法があります。

  1. その値を使用するときはいつでも計算全体をコピーします (最も効率的で、読みにくい)。
  2. 派生テーブルを使用している (効率が低く、読みやすい)

後者の場合、次のようにする必要があります。

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

派生テーブルはすべての行のスキャンを実行するため、効率が低下することを強調したいと思います。ほとんどの場合、数式をコピーする方が適切です。

PS: 最初のオプションを使用する場合は、2 番目のオプションを次のように記述できることに注意してくださいIF

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

これはもう少し読みやすいです。

于 2012-04-09T05:51:12.793 に答える