2012-07-04 4 views
1

특정 반경 내에서 사용자를 반환하는 사용자 집합에 대해 쿼리를 수행하고 있습니다. 사용자는 3 가지 유형의 사용자 그룹 중 하나에 속합니다. 그룹 1 (거리별로 정렬)에서 사용자를 표시하고 그룹 2에서 사용자를 조합하여 (거리별로 정렬) & 3을 표시하여 반환 목록을 정렬해야합니다. ORDER BY 절을 쉽게 사용할 수는 있지만 그룹 2 & 3이 결과에 함께 결합되어 있는지 확인하는 방법을 모르겠습니다.mysql 문에서 ORDER BY를 사용하고 결과를 그룹화합니다.

다음은 사용자를 그룹 1, 2, 3 순으로 반환하고 해당 그룹 내에서 거리별로 정렬 한 내용입니다. 그룹 1, 그 다음 2 & 3을 거리로 정렬하여 반환해야합니다.

또한 내부 조인을 제대로 사용하고 있는지 확실하지 않습니다. 왼쪽 조인이어야합니까?

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 

답변

2

ORDER BY CASE을 사용하면 조건부로 그룹 1을 강제로 순서를 적용 할 수 있습니다. 나는이 일을해야한다고 생각 :

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

CASE 문은 group_id의 다른 값을 group_id = 1 1 0을 반환합니다. 0보다 먼저 정렬 된 다음이 두 하위 그룹 (&1)은 distance ASC으로 정렬되어 있으므로 3을 함께 정렬합니다.

+0

고맙습니다! 그건 내 프로그램에서 완벽하게 작동했습니다. –

관련 문제