我正在对一组用户进行查询,这些用户返回特定半径范围内的用户。用户属于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
答案 0 :(得分:2)
您可以使用ORDER BY CASE
有条件地首先应用强制组1的订单。我认为这应该做的工作:
ORDER BY
CASE WHEN b.group_id = 1 THEN 0 ELSE 1 END,
distance ASC
CASE
语句为group_id = 1
返回0,为group_id
的任何其他值返回1。 0在1之前排序,然后这两个子组(0和1)被distance ASC
子序排列,因此group_id
2&amp; 3排在一起。