0

次のような 2 つのエイリアス ファイルを作成するクエリがあります。

 (CASE WHEN `venueID` > 0 THEN `venueLongitude` ELSE `specialLongitude` END) AS `longitude`
 (CASE WHEN `venueID` > 0 THEN `venueLatitude` ELSE `specialLatitude` END) AS `latitude`

特定のクエリで使用する経度と緯度を決定します (テーブルには多数の JOIN がありますが、この例では、Gigsを実行するテーブルから というテーブルNATURAL LEFT JOINへの JOIN のみVenuesです。

そのビットは正常に機能し、場所の座標を返します。距離計算を行うことに興味があり、それによって注文できます。

距離フィールドは次のようになります。

((ACOS(SIN($lat * PI() / 180) * SIN(`latitude` * PI() / 180) + COS($lat * PI() / 180) * COS(`latitude` * PI() / 180) * COS(($lon - `longitude`) * PI() / 180)) * 180 / PI()) * 60 * 1.1515)

しかし、クエリを実行すると、エラーが発生しますUnknown column 'latitude' in 'field list'。このようなルックアップを実行する方法を知っている人はいますか。

ps

地理空間クエリを使用できることはわかっていますが、後でさらにクエリに使用できる方法で答えを知りたいです。

SELECT *,(CASE WHEN `a` > 0 THEN `a` ELSE `b` END) AS `x`,(`x` MOD 3) AS `y` FROM `Foo`
4

2 に答える 2

1

2 つの方法:

a) エイリアスを SQL に置き換えます

b) 次のように、最初のクエリを別のクエリでカプセル化します。

     SELECT 
          t.latitude,
          t.longitude, 
          ((ACOS(SIN($lat * PI() / 180) * SIN(t.latitude * PI() / 180) + COS($lat * PI() / 180) * COS(latitude * PI() / 180) * COS(($lon - t.longitude) * PI() / 180)) * 180 / PI()) * 60 * 1.1515) as distance

     FROM ( 
       SELECT ((CASE WHEN `venueID` > 0 THEN `venueLongitude` ELSE `specialLongitude` END) AS `longitude`, (CASE WHEN `venueID` > 0 THEN `venueLatitude` ELSE `specialLatitude` END) AS `latitude` FROM Gigs left join Venues on ....
     ) as t
于 2013-03-13T14:13:49.837 に答える
1

距離を置きたいSELECT場合は、値のケースを再宣言する必要があると思います。別名: を使用するのではなく、SELECT col alias1, alias1 + 1 alias2実行する必要がありますSELECT col alias1, col + 1 alias2Where you can use column aliasesに関するこの MySQL ドキュメントを参照してください。

距離だけを知りたい場合GROUP BYは、距離関数でエイリアスを使用できます。ただし、SELECT距離が必要な場合は、距離関数のエイリアスの使用を評価されたCASEコードに置き換える必要があります。

ORDER BYエイリアスの使用:

SELECT
  (CASE WHEN `venueID` > 0 THEN `venueLongitude` ELSE `specialLongitude` END) longitude,
  (CASE WHEN `venueID` > 0 THEN `venueLatitude` ELSE `specialLatitude` END) latitude
FROM table_name
ORDER BY ((ACOS(SIN(latitude * PI() / 180) * SIN(latitude * PI() / 180) + COS(latitude * PI() / 180) * COS(latitude * PI() / 180) * COS(longitude * PI() / 180)) * 180 / PI()) * 60 * 1.1515)

SELECTエイリアスを使用できません (面倒です!):

SELECT
  (CASE WHEN `venueID` > 0 THEN `venueLongitude` ELSE `specialLongitude` END) longitude,
  (CASE WHEN `venueID` > 0 THEN `venueLatitude` ELSE `specialLatitude` END) latitude,
  (
    ((ACOS(SIN((CASE WHEN `venueID` > 0 THEN `venueLatitude` ELSE `specialLatitude` END) * PI() / 180) * SIN((CASE WHEN `venueID` > 0 THEN `venueLatitude` ELSE `specialLatitude` END) * PI() / 180) + COS((CASE WHEN `venueID` > 0 THEN `venueLatitude` ELSE `specialLatitude` END) * PI() / 180) * COS((CASE WHEN `venueID` > 0 THEN `venueLatitude` ELSE `specialLatitude` END) * PI() / 180) * COS((CASE WHEN `venueID` > 0 THEN `venueLongitude` ELSE `specialLongitude` END) * PI() / 180)) * 180 / PI()) * 60 * 1.1515)
  ) distance
FROM table_name
ORDER BY distance
于 2013-03-13T14:18:25.467 に答える