在mysql语句中使用ORDER BY并对结果进行分组

时间:2012-07-04 14:24:49

标签: mysql sql

我正在对一组用户进行查询,这些用户返回特定半径范围内的用户。用户属于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

1 个答案:

答案 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排在一起。