0

このタイプのクエリを理解できません: これは私のクエリです:

SELECT 
  accomodation.*, 
  db_cities.title_en AS city, 
  db_cities.title_url AS city_url, 
  db_countries.title_url_en AS country_url 
FROM 
  (SELECT id, aid, title_en, title_url_en, address, city_id, zip, district_id, province_id, region_id, country_id, mountain_id, stars, picture, valid_from, valid_to FROM accomodation ORDER BY info_date_add DESC) AS accomodation 
LEFT JOIN db_cities 
  ON db_cities.id = accomodation.city_id 
JOIN db_countries 
  ON db_countries.id = accomodation.country_id 
WHERE 
  db_countries.title_url_en LIKE '%country%' 
  AND db_countries.id = '202' 
GROUP BY accomodation.aid 
ORDER BY CASE 
  WHEN accomodation.valid_to>=NOW() AND accomodation.valid_from<=NOW() THEN 0 
  WHEN NOW()>accomodation.valid_to AND accomodation.valid_to!='0000-00-00' THEN 1 
  ELSE 2 END, accomodation.title_en 
LIMIT 10 OFFSET 0

うまく機能しています...skiresort_locationsというテーブルをもう1つ結合する必要がありますが、どの列でも結合されていないため、ONを使用できないという問題があります。緯度経度から計算した距離で結合したいです。

テーブル skiresort_locations には緯度と経度の列があり、テーブル accomodation にも緯度と経度の列があります。テーブル skiresort_locations に参加して、距離が 50km 以下の宿泊施設を表示します。ON のサブクエリを作成するアイデアがありましたが、それが可能かどうかはわかりません。

これは、距離を計算するために選択されています。

(((acos(sin((skiresort_locations.latitude*pi()/180)) 
                * sin((accomodation.latitude*pi()/180))
                + cos((skiresort_locations.latitude*pi()/180)) * cos((accomodation.latitude*pi()/180))
                * cos(((skiresort_locations.longitude - accomodation.longitude)*pi()/180))))*180/pi())*60*1.1515*1.609344) AS distance

誰かが私の難しい説明を理解し(私の英語で申し訳ありません)、助けてくれることを願っています...

4

2 に答える 2

0

field1=field2結合は-type 式だけでなく、任意の式で実行できます。

JOIN othertable ON distance_function() < 50

完全に受け入れられるでしょう。重要なのは、式が真/偽の状態に評価できるかどうかです。true の場合、考慮されるレコードは結合の一部になります。false の場合、レコードは除外されます。その真/偽にどのように到達するかは問題ではなく、真/偽になってしまうだけです。

于 2013-06-19T14:16:02.887 に答える