1

特定の半径内のユーザーを返す一連のユーザーに対してクエリを実行しています。ユーザーは、3 つの異なるタイプのユーザー グループのうちの 1 つに属しています。グループ 1 のユーザーを表示して (距離で並べ替え)、次にグループ 2 と 3 のユーザーを組み合わせて (距離で並べ替え)、返されたリストを並べ替える必要があります。ORDER BY 句を簡単に使用できますが、結果でグループ 2 と 3 が結合されていることを確認する方法がわかりません。

次のステートメントは、最初にグループ 1、次に 2、次に 3 でユーザーを返し、それらのグループ内の距離で並べ替えます。グループ 1 を返し、次に 2&3 を距離順に並べ替える必要があります。

また、INNER JOIN を適切に使用しているかどうかもわかりませんが、これは LEFT JOIN にする必要がありますか?

SELECT
  SQL_CALC_FOUND_ROWS 
  a.*, 
  b.group_id,
  ROUND(( 3959 * acos( cos( radians( $lat ) ) * cos( radians( a.latitude ) ) * cos( radians( a.longitude ) - radians( $lon ) ) + sin( radians( $lat ) ) * sin( radians( a.latitude ) ) ) ), 1) AS distance
FROM `users` AS a
INNER JOIN `user_group_map` AS b
  ON a.`id` = b.`user_id`
HAVING distance <= $radius
ORDER BY
  b.`group_id` DESC,
  distance ASC
4

1 に答える 1

2

を使用しORDER BY CASEて、グループ 1 を最初に強制する順序を条件付きで適用できます。私はこれが仕事をするべきだと思います:

ORDER BY
  CASE WHEN b.group_id = 1 THEN 0 ELSE 1 END,
  distance ASC

このCASEステートメントは、 のその他の値に対して 0 を返しgroup_id = 1、その他の値に対して 1 を返しますgroup_id。0 は 1 より先にソートされ、これらの 2 つのサブグループ (0 & 1) は、2 & 3 ソートによってサブオーダーさdistance ASCれます。group_id

于 2012-07-04T14:37:44.823 に答える