2012-07-27 3 views
5

の別名に参加する:MySQLは、私はそうのようなクエリを持って計算されたコラム

SELECT User.id, 10*10 as distance 
FROM USERS 
INNER JOIN 
(
    SELECT Location.user_id, 
    min(10 * 10) as mindistance 
    FROM Location 
    GROUP BY Location.user_id 
) L ON Users.id = Location.user_id AND distance = L.mindistance 

私はそのままそれを残す場合は、私は入れません:

Unknown column 'distance' in 'on clause' 

をしかし、私は置けばだけではなく、距離のUser.distanceは、私が取得:

MySQL syntax error near.... 

私は計算フィールドにこのようにエイリアスを使用することができませんか?計算がはるかに複雑であるため、10 * 10は単純なプレースホルダに過ぎません。レコードを制限するために、どのインデックスが使用するために使用されている - - あなたは最終結果をフィルタリングする必要があるので、導出された値オプティマイザで使用することはできませんあなたが句は、クエリで得られた値を使用することはできません

+0

[MySQLクエリのWHERE句で列エイリアスを使用するとエラーが発生する](http://stackoverflow.com/questions/942571/using-column-alias-in-where-clause-of-mysql-query-produces -an-error) – Joni

答えて

0
SELECT User.id, 10*10 as distance 
FROM USERS 
INNER JOIN 
( 
    SELECT Location.user_id, 
    min(10 * 10) as mindistance 
    FROM Location 
    GROUP BY Location.user_id 
) L ON User.id = Location.user_id AND L.mindistance =10*10 
0

何をやっているかなり確実ではないが、何かしてみてください:クエリで計算を3回行うことを避けるために

SELECT User.id, 10*10 as distance 
FROM USERS 
INNER JOIN 
( 
    SELECT Location.user_id, 
    min(10 * 10) as mindistance 
    FROM Location 
    GROUP BY Location.user_id 
) L ON User.id = Location.user 
HAVING USERS.distance = L.mindistance 
5

を、あなたはFROM副選択で、外側の計算をラップすることができ、意志(それはあなたの元のクエリではアクセスできませんでした場合)あなたはエイリアスフィールド名へのアクセス権を与える:ここで

SELECT a.* 
FROM 
(
    SELECT id, 10*10 AS distance 
    FROM USERS 
) a 
INNER JOIN 
(
    SELECT user_id, 
    MIN(10 * 10) AS mindistance 
    FROM Location 
    GROUP BY user_id 
) L ON a.id = L.user_id AND a.distance = L.mindistance 

は、計算はわずか3の2回の代わりに行われます。

10

ON句に列エイリアスを使用しようとしています。 MySQL documentationがこのような状況について言いたいことがあります。ONで使用

conditional_exprが WHERE句で使用できるフォームのいずれかの条件式です。

And also

標準SQLはWHERE句でカラムのエイリアスへの参照を禁止します。この制限は、WHERE句が評価されるときに列の値がまだ決定されていない可能性があるために課せられます。たとえば、次のクエリは違法です:

SELECT User.id, @dist as distance 
FROM USERS 
INNER JOIN 
(
    SELECT Location.user_id, 
    min(10 * 10) as mindistance 
    FROM Location 
    GROUP BY Location.user_id 
) L ON Users.id = Location.user_id AND (@dist := 10*10) = L.mindistance 

あなたは使用変数はON句で表現を計算し、このように、列リストに値を使用することができ、言いました

+0

著者のSQLにはWHERE句がありません。 –

+1

fixed @JohnFactorial – Joni

関連する問題