3

次の 2 つのクエリを組み合わせた単一のクエリを作成しようとしています。

SELECT 
  campgroundid, 
  ( 3959 * acos( cos( radians(37) ) * cos( radians( lat ) ) * 
    cos( radians( lng ) - radians(-122) ) + 
    sin( radians(37) ) * sin( radians( lat ) ) ) ) 
  AS distance 
FROM campground 
HAVING distance < 25 
ORDER BY distance LIMIT 0 , 20;

SELECT * FROM campground WHERE type='private' AND wifi = 1

それらを IN に入れてみましたが、修正方法がわからない構文エラーが返されました。HAVING を削除してクエリを組み合わせてみましたが、何が何でdistanceあるかを理解できないと表示されます。どんな助けでも大歓迎です。ありがとう。

出力: [campgroundid, name, type, wifi, distance] [1,camp ABC, private, 1, 1.34 mi] [2,camp XYZ, private, 1, 4.44 mi]

4

5 に答える 5

3

与えられていない情報の中には、キャンプ場とマーカーテーブルがどのように関連しているかがあります。テーブルを結合する方法を知るには、その情報が必要になります。

また、HAVINGにはGROUP BYが必要です(GROUP BYの集計結果に対するWHERE句のように機能します)。マーカーの行を集約していない場合は、HAVINGではなくWHEREが必要です。

推測では、次のようなものが必要です。

 SELECT id (expression) as distance FROM markers
      WHERE distance < 25 AND 
        campground_id IN (SELECT id FROM campgrounds WHERE type = 'private' AND wifi = 1)

編集:テーブルが1つしかないという新しい情報を反映しています。

WHERE句で列ALIASを使用することはできません。あなたはそれを知っていると思いますし、HAVINGでそれらを使用できることも知っていると思います。そのため、WHEREの代わりにHAVINGを交換しようとしています。これを行うには、GROUPBYクエリとして書き直す必要があります。

SELECT campgroundid, name, private, wifi, 
   ( 3959 * acos( cos( radians(37) ) * cos( radians( lat ) ) * 
    cos( radians( lng ) - radians(-122) ) + 
    sin( radians(37) ) * sin( radians( lat ) ) ) ) 
    AS distance 
FROM campground 
GROUP BY campgroundid 
HAVING distance < 25 AND type='private' AND wifi = 1
ORDER BY distance LIMIT 0 , 20;

これは、campgroundidが一意である限り機能します(他の値はこのIDの唯一のレコードから取得されるため)。

于 2011-01-10T02:24:28.773 に答える
0

HAVINGは、およびその他の集計関数WHERE distance < 25などのクエリ用であるため、そうあるべきであるように見えます。HAVING MAX(distance) < 25

于 2011-01-10T02:23:49.710 に答える
0

これは試してみる価値があると思います(2番目のSQLのwhere句を最初に追加するのと同じくらい簡単です)

SELECT 
  ... AS distance 
FROM campground 
WHERE type='private' AND wifi = 1
HAVING distance < 25 
ORDER BY distance LIMIT 0 , 20;
于 2011-01-10T02:35:34.090 に答える
0

SELECT campgroundid, ( 3959 * acos( cos( radians(37) ) * cos( radians( lat ) ) * cos( radians( lng ) - radians(-122) ) + sin( radians(37) ) * sin( radians( lat ) ) ) ) AS distance FROM campground WHERE type='private' AND wifi = 1 ORDER BY distance LIMIT 0 , 20 HAVING distance < 25

これはうまくいくかもしれません

于 2014-02-17T12:27:26.577 に答える
-1

あなたの質問がJOINロジックを持つ2つのテーブルからのWHERE句を持つことである場合。次に、その値をSELECTリストに含める必要があります。たとえば、SELECT USER.UserName、USER.UserId、LOC.id、LOC.lat、LOC.lon、(3959 * acos(cos(radians( '123.1210022'))* cos(radians(lat))* cos(radians (lon)-radians( '21 .200001'))+ sin(radians( '123.1210022'))* sin(radians(lat))))AS distance FROM userlocation LOC、user USER HAVING distance <'1' AND LOC.id = USER.UserId ORDERBY距離LIMIT0、20

選択リストでUSER.UserIdを見逃すと、WHERE句でLOC.id=USER.UserIdを使用できなくなります。

于 2012-12-04T13:54:58.293 に答える