2012-12-10 5 views
1

결과 "user_id"가 DESCending 순서로 Location 테이블의 첫 번째 레코드에 해당하는 것으로 예상됩니다. 하지만 첫 번째 레코드의 "user_id"가 오름차순 또는 ID 순서로 나타납니다.Order By가 예상대로 작동하지 않는 쿼리 MySQL

SELECT Device.name, Location.user_id 
    FROM locations Location 
     LEFT JOIN devices Device 
      ON Device.id = Location.device_id 
WHERE Device.id IN (491) 
GROUP BY Location.device_id 
ORDER BY Location.location_datetime DESC 

누구나 알아? 개선하는 방법?

감사합니다. 이 보장되지 않습니다

SELECT 
    devices.name, 
    (select locations.user_id 
    from locations 
    where locations.device_id = devices.id 
    order by locations.location_datetime desc 
    limit 1) 
FROM 
    devices 
WHERE 
    device.id = 491 

첫 번째 또는 마지막 레코드를 얻을 수 집계되지 열이 group by을 사용할 수 없습니다

+0

귀하의 기대치가 잘못되었습니다. 그 이유를 설명하는 링크가 있습니다 : http://dev.mysql.com/doc/refman/5.6/en/group-by-extensions.html. 특히 당신은이 비트를 읽어야한다 :'서버는 각 그룹으로부터 자유롭게 값을 선택할 수 있기 때문에, 같은 값이 아니면 다른 값을 사용할 수 없다. ' –

+1

왜'Location.device_id'로 그룹화하고'Device .name, Location.user_id'? 대신'ORDER BY user_id'가 아닌 이유는 무엇입니까? 무엇을하려고하는지 설명해 주시겠습니까? –

+0

감사 마크 - 봐요! 나는 그만큼 짐작했다. – iss42

답변

0

는이

 SELECT Device.name, Location.user_id ,Location.location_datetime 
     FROM locations Location 
     LEFT JOIN devices Device 
     ON Device.id = Location.device_id 
    WHERE Device.id IN (491) 

    ORDER BY Location.user_id DESC 
    GROUP BY Location.device_id 
2

당신이 뭔가를 사용할 수 있습니다 시도 그것은 항상 효과가있을 것입니다.

편집 : 당신이 위치에서 하나 개 이상의 필드를 선택해야하는 경우, 당신은이를 사용할 수 있습니다 :이 쿼리는 각 DEVICE_ID 지난 위치를 선택합니다

SELECT l1.*, devices.name 
FROM 
    locations l1 inner join 
    (select device_id, max(location_datetime) as maxdt 
    from locations 
    group by device_id) l2 
    on l1.device_id = l2.device_id and l1.location_datetime=l2.maxdt 
    left join devices 
    on devices.id = l1.device_id 

. 동일한 최대 날짜 시간을 갖는 둘 이상의 위치가있는 경우,이 쿼리는 각각을 반환합니다. 하나만 있으면되고 어떤 것이 선택 되든 상관 없으면 마지막에 GROUP BY l1.device_id 절을 추가 할 수 있습니다.

+0

감사합니다! 최신 location_datetime과 같이 위치에서 원하는 다른 필드도 있습니다. 그래서 그 목적을 위해 외부 절도 유지해야합니다. – iss42

+0

@ iss42 답변을 업데이트했습니다 ... 위치에서 더 많은 필드를 선택해야하는 경우 제 두 번째 쿼리와 같은 것이 필요하다고 생각합니다 ..이게 당신이 찾고있는 것이 있다면 알려주세요 – fthiella

관련 문제