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

您可以使用 anORDER BY CASE首先有条件地应用命令强制组 1。我认为这应该做的工作:

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

该语句为 的任何其他值CASE返回 0和 1 。0 在 1 之前排序,然后这两个子组(0 和 1)按2 和 3 排序在一起。group_id = 1group_iddistance ASCgroup_id

于 2012-07-04T14:37:44.823 回答