1

これら2つの異なるクエリがあります。

このクエリは、返信カウンターに従って「posts」テーブルからレコードを取得します。このクエリでは、返信のある投稿のみが返されます。

SELECT posts.title, posts.num, posts.status, COUNT( posts_replies.post_num)  AS count
FROM posts_replies
INNER JOIN posts ON ( posts_replies.post_num = posts.num )
WHERE posts.status = 1
AND posts.category='uncategorized'
GROUP BY posts.num

そして、これは上記のクエリとマージして、gps に従ってレコードをプルおよびソートする新しいクエリです。

SELECT num, title, ( 3959 * acos( cos( radians( 37 ) ) * cos( radians( lat ) ) * cos( radians( lon ) - radians( -122 ) ) + sin( radians( 37 ) ) * sin( radians( lat ) ) ) ) AS distance
FROM posts
HAVING distance <75
ORDER BY distance

このクエリは、緯度と経度の列を使用して、ユーザーの半径 75 マイル内にあるレコードを返します。

私はSQLの専門家ではなく、両方のクエリをマージして次の基準を持つ結果を収集する方法がわかりません:

  1. 返信のある投稿のみを返す
  2. 距離で並べ替え
  3. 返信数で並べ替え

どんな助けでも大歓迎です。

ありがとう!

4

1 に答える 1

3

2 番目のクエリのhaving句は正しくないようです。SQL のほとんどの方言では、. なしでは is を使用できませんgroup by。MySQL t が暗黙的にクエリ全体を集約として扱う (1 行を返す) のか、havingそれともwhere. いずれの場合も、where集計がない場合は明示的に使用する必要があります。

where句を入れることで、それらを組み合わせることができます。変数の定義をより明確にするために、サブクエリでそれを行います。

      SELECT p.title, p.num, p.status, p.distance,
             COUNT( p_replies.post_num)  AS count
      FROM posts_replies pr  INNER JOIN
           (select p.*,
                   ( 3959 * acos( cos( radians( 37 ) ) * cos( radians( lat ) ) * cos( radians( lon ) - radians( -122 ) ) + sin( radians( 37 ) ) * sin( radians( lat ) ) ) ) AS distance
            from posts p
           ) p
           ON pr.post_num = p.num
      WHERE p.status = 1 AND
            p.category='uncategorized' and
            distance < 75
      GROUP BY p.num
      order by distance
于 2012-12-09T15:55:54.803 に答える