11

次のようなクエリがあります。

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 は単なるプレースホルダーです。

4

4 に答える 4

14

ON句で列の別名を使用しようとしています。MySQLのドキュメントには、この状況について次のように書かれています。

with で使用されるconditional_exprON、WHERE 句で使用できる形式の条件式です。

また

標準 SQL では、WHERE 句での列エイリアスへの参照は許可されていません。この制限が課されるのは、WHERE 句が評価されるときに、列の値がまだ決定されていない可能性があるためです。たとえば、次のクエリは不正です。

つまり、次のように、変数使用して句内の式を計算ONし、列リスト内の値を使用できます。

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
于 2012-07-27T10:03:01.547 に答える
9

クエリで計算を 3 回行う必要がないようにするには、外側の計算を副選択でラップします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 回だけ実行されます。

于 2012-07-27T10:00:26.943 に答える
1
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
于 2012-07-27T09:52:19.073 に答える
1

クエリ where 句で派生値を使用することはできません - where はレコードと使用するインデックスを制限するために使用されます - 派生値はオプティマイザーで使用できないため、最終結果をフィルタリングする必要があります。

あなたが何をしているのかよくわかりませんが、次のようなことを試してください:

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
于 2012-07-27T09:58:28.353 に答える