2011-07-25 2 views
2

下記のSQLクエリを実行するとエラーが発生します。何が間違っていると思いますか?SQLクエリMySQL

#1054 - Unknown column 'distance' in 'where clause' 
SELECT longitude, latitude, firstname, surname, profile_pic, facebook_id, 6371 * ACos(Cos(RADIANS(users.latitude)) * Cos(RADIANS(23)) * Cos(RADIANS(23) - RADIANS(users.longitude)) + Sin(RADIANS(users.latitude)) * Sin(RADIANS(23))) AS distance 
FROM users 
WHERE distance >=1000 
ORDER BY distance 
LIMIT 20 
+0

距離は、私が代わりに 'FROM SELECT'のLINQで義務付けられたフォーマットを好きな理由です列名 – Ibu

+1

ではありません。 – jdmichal

答えて

3

エイリアスの前にwhere句が評価されます。

SELECT longitude, latitude, firstname, surname, profile_pic, facebook_id, distance 
FROM 
    (SELECT longitude, latitude, firstname, surname, profile_pic, facebook_id, 6371 * ACos(Cos(RADIANS(users.latitude)) * Cos(RADIANS(23)) * Cos(RADIANS(23) - RADIANS(users.longitude)) + Sin(RADIANS(users.latitude)) * Sin(RADIANS(23))) AS distance 
    FROM users 
) as u1 
    WHERE distance >=1000 
    ORDER BY distance 
    LIMIT 20 
+0

where句が最初に評価されたことを知りませんでした。+1 – Ibu

+0

ありがとうございましたが、今はあなたのクエリでこのエラーが発生しています...#1248 - すべての派生テーブルには独自のエイリアスが必要です –

+0

@Jaeはエイリアスをサブクエリ。 – Jacob

3

WHERE句の代わりにHAVING句を使用します。別名の距離はWHERE句には存在しません。

SELECT longitude, latitude, firstname, surname, profile_pic, facebook_id, 6371 * ACos(Cos(RADIANS(users.latitude)) * Cos(RADIANS(23)) * Cos(RADIANS(23) - RADIANS(users.longitude)) + Sin(RADIANS(users.latitude)) * Sin(RADIANS(23))) AS distance 
FROM users 
HAVING distance >=1000 
ORDER BY distance 
LIMIT 20 
0

あなたが好きな内部クエリを使用することができます...

SELECT * 
FROM 
    (
    SELECT longitude, latitude, firstname, surname, profile_pic, facebook_id, 6371 * ACos(Cos(RADIANS(users.latitude)) * Cos(RADIANS(23)) * Cos(RADIANS(23) - RADIANS(users.longitude)) + Sin(RADIANS(users.latitude)) * Sin(RADIANS(23))) AS distance 
    FROM Users 
) as u1 
WHERE distance >=1000 
ORDER BY distance 
LIMIT 20