0

私はmysqlでこのクエリを持っています:

    set @dist=20;
    set @earthRadius=6371;
    SELECT *,SPLIT_STR(posizione_GPS,';', 1) as mylat,SPLIT_STR(posizione_GPS,';', 2) as mylon,(SELECT CALC_DISTANCE(mylat,mylon,cit.lat,cit.lng,@earthRadius) as distance FROM city as cit HAVING distance<@dist ORDER BY distance asc LIMIT 1 ) as distance FROM statistiche as stat

これで統計を取得し、各統計が調整された GPS に関連付けられていることを考えると、既にデータベースにあるテーブル (都市) を使用して、それに関連付けられている都市の名前を取得したいと考えています。この計算を行うには、座標間の距離を計算し、距離の少ない都市を使用します。

CALC_DISTANCE は、2 つの GPS ポイント間の距離を計算するためのカスタム関数です。

クエリは機能しますが、都市の名前が必要です。サブクエリに 2 番目の列を入力すると、次のようになります。

    set @dist=20;
    set @earthRadius=6371;
    SELECT *,SPLIT_STR(posizione_GPS,';', 1) as mylat,SPLIT_STR(posizione_GPS,';', 2) as mylon,(SELECT nome, CALC_DISTANCE(mylat,mylon,cit.lat,cit.lng,@earthRadius) as distance FROM city as cit HAVING distance<@dist ORDER BY distance asc LIMIT 1 ) as distance FROM statistiche as stat

このエラーが発生します

    Error Code: 1241. Operand should contain 1 column(s)

都市の名前を取得するにはどうすればよいですか? ありがとう

statisticheテーブルの構造は次のとおりです。

    `id` int(11) NOT NULL AUTO_INCREMENT,
    `utenti_id` int(11) NOT NULL,
    `spots_id` int(11) NOT NULL,
    `posizione_GPS` varchar(45) DEFAULT NULL,
    `data` date DEFAULT NULL,
    `ora` time DEFAULT NULL,
     PRIMARY KEY (`id`)

cityテーブルの構造は次のとおりです。

   `id` varchar(10) NOT NULL,
   `nome` varchar(100) DEFAULT NULL,
   `prov` varchar(45) DEFAULT NULL,
   `lat` float(10,6) DEFAULT NULL,
   `lng` float(10,6) DEFAULT NULL,
   PRIMARY KEY (`id`)
4

1 に答える 1

0

問題がわかりました。サブ選択は次のように構築されます。

(SELECT nome, CALC_DISTANCE(mylat,mylon,cit.lat,cit.lng,@earthRadius) as distance 
        FROM city as cit 
        HAVING distance<@dist 
        ORDER BY distance asc LIMIT 1 ) 
      as distance

このサブ選択では、2 つの列 (nome と CALC_DISTANCE の結果) を選択していますが、これは実行できません。あなたはすでにこれを知っていたと思いますが、私はそれを理解していませんでした。

サブクエリを変更して、都市のみを返すようにします。都市が利用可能になったら、この 1 つの行について距離を再計算できます。

それはおそらく最も効率的な方法ではありませんが、私が考えることができる唯一の方法です。

編集

サブセレクトの代わりに JOIN を使用するようにクエリを作り直します。

set @dist=20;
set @earthRadius=6371;

SELECT * FROM (
SELECT 
  stat.id as s_id,
  posizione_GPS,
  SPLIT_STR(posizione_GPS,';', 1) as mylat,
  SPLIT_STR(posizione_GPS,';', 2) as mylon,
  city.id as c_id,
  lat,
  lng,
  CALC_DISTANCE(SPLIT_STR(posizione_GPS,';', 1), SPLIT_STR(posizione_GPS,';', 2), lat, lng, 6371) as distance
 FROM statistiche stat JOIN city 
ON CALC_DISTANCE(SPLIT_STR(posizione_GPS,';', 1), SPLIT_STR(posizione_GPS,';', 2), lat, lng, 6371) < @dist
ORDER BY s_id, distance ASC
) A group by s_id;

このクエリは、私が作成したテスト データセットで適切に機能しているようで、パフォーマンスはサブクエリを使用した場合よりもそれほど悪くはありません。

于 2015-12-09T15:39:47.820 に答える