特定の半径内のユーザーを返す一連のユーザーに対してクエリを実行しています。ユーザーは、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