2012-04-09 6 views
0

は私が書くしようとしているクエリです:SELECTで変数を代入し、後で同じSELECTで変数を使用できますか?ここ

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

私はエラー「不明な列 『CURRENT_BID』」を取得しています。前の行に現在の列を作成しただけなので、私はそれを仮定しています。とにかく、このクエリを私が望むように動作させることができますか?

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つのif文を使用するだろうと思います。

currentを割り当てる方法はありますか?MAX(B.amount)を2回計算しないでください。

答えて

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

ネストされたクエリが最初に実行されるので、その結果を使用できることは間違いありません。同じクエリの異なる列は並行として扱われるので、それらを互いに依存させることはできません。

+0

あなたは私にそれを打つ...私はそれが唯一の方法だと思う。でも、SQLにはカラムをエイリアスするための組み込みの方法がないのはなぜかというと奇妙に思えます。 – McGarnagle

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:あなたが最初のオプションのために行くしている場合は、この方法であなたの二IFを書くことができることに注意してください。

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

もう少し読みやすいです。

関連する問題