2013-04-02 4 views
0

I했습니다이 테이블 (CheckinTable) : USER_ID는 외국이다SQL 쿼리를 두 번 쿼리

  • ID
  • 위도
  • 경도
  • USER_ID

을 생성 UserTable에 대한 키.

더 많은 체크 인을 가지고있는 사용자마다 생성 된 필드를 기반으로 최신 체크 인을 반환하는 쿼리를 수행해야합니다.

나는 수정 DESC BY ORDER과 최신 체크인을 가져올 수 있지만 난이 어떻게 결합 할 수 있습니다 (44.00과 41.00와 9.18 및 9.44 간의 p.longitude 간의 p.latitude가 WHERE 예를 들어) 다른 기준 을 설정해야하는 경우 geolocalizations 절을 존중하는 최신 체크인을로드하기위한 두 개의 쿼리?

편집 :

방지하기 위해 오해, 난 단지 만들어 DESC로 정렬 된 사용자에 대한 최신 CHECKIN에 쿼리를 실행해야합니다. 나는 테이블 체크 인에서 각 사용자에 대해 단일 최신 체크 인을 추출한 다음 geolocalization 절을 적용해야한다고 생각한다. 내가 어떻게 할 수 있니?

답변

1

WHERE 절과 ORDER BY 절은 완전히 구분되어 있으며 원하는대로 혼합하고 일치시킬 수 있습니다. ORDER BY는 항상 WHERE 뒤에 와야합니다.

SELECT * 
FROM CheckinTable as p 
WHERE p.latitude BETWEEN 44.00 AND 41.00 AND p.longitude BETWEEN 9.18 AND 9.44 
ORDER BY modified DESC 
1

귀하의 질문을 이해한다고 가정하면 각 사용자와 최대 (작성한) 날짜를 반환하려고합니다.

select distinct t.* 
from yourtable t 
    join (
     select max(created) maxcreated, user_id 
     from yourtable 
     group by user_id 
    ) t2 on t.user_id = t2.user_id and t.created = t2.maxcreated 

그리고 당신은 WHERE 기준이있는 경우, 서브 쿼리에 넣어 :

select distinct t.* 
from yourtable t 
    join (
     select max(created) maxcreated, user_id 
     from yourtable 
     where latitude between 44.00 and 41.00 
     group by user_id 
    ) t2 on t.user_id = t2.user_id and t.created = t2.maxcreated 
이런 경우 (당신의 RDBMS에 따라 다른 옵션이 있지만), 나는 보통 자체에 테이블을 조인

SQL Fiddle Demo

+0

@Andomar - 나는 OP가 무엇을 요구하고 있는지 100 % 확신하지 못했습니다. 각 사용자에 대해 언급 된대로 생성 된 내용을 기반으로 최신 체크인을 반환하십시오.그러나 그렇습니다. 만약 OP가 가장 최근의 기록을 원할 경우, 위의 기준은 정확한 것입니다. OP가 그것을 필요로하지 않는 경우 나는 삭제할 것이다 :) – sgeddes

+0

당신 말이 맞아, 당신이 그런 식으로 질문을 읽을 수있는 것처럼 보인다. +1 : – Andomar

+0

이 쿼리는 작동하지만 내 경우에는 다른 문제가 있습니다. 내가 만든 DESC에 의해 명령 된 가장 최근의 CHECKIN에 대해서만 쿼리를 실행해야합니다. 나는 테이블 체크 인에서 각 사용자에 대해 단일 최신 체크 인을 추출한 다음 geolocalization 절을 적용해야한다고 생각한다. 내가 어떻게 할 수 있니? – CeccoCQ

0

그냥 user_id12345 단일 사용자에 대한 적절한 기록을 뽑아 :

SELECT TOP 1 CheckinTable.* 
FROM   CheckinTable 
WHERE  CheckinTable.user_id = 12345 
AND   CheckinTable.latitude >= 44.00 
AND   CheckinTable.latitude <= 41.00 
AND   CheckinTable.longitude >= 9.18 
AND   CheckinTable.longitude <= 9.44 
ORDER BY  CheckinTable.modified DESC 

여러 사용자를 끌어하려는 경우, 당신은 하위 쿼리 또는 overpartition by 문 (그룹화하는 것보다 더 효율적 partition by이지만, 사용하는 기발한 비트)를 사용하는 중 필요한 것 :

을 가끔 당신이 between (포함, 전용 등)보다 반환 무엇을 통해 좀 더 컨트롤을 원하는 간단하기 때문에, >= 또는 <= 및 이와 유사한 문장보다는 between를 사용하는 것을 선호
SELECT p.id , 
     p.created , 
     p.latitude , 
     p.longitude , 
     p.user_id 
FROM (
    SELECT CheckinTable.id , 
    CheckinTable.created , 
    CheckinTable.latitude , 
    CheckinTable.longitude , 
    CheckinTable.user_id , 
    ROW_NUMBER() OVER (PARTITION BY 
     CheckinTable.user_id) AS the_row_number 
    FROM   CheckinTable 
    WHERE  CheckinTable.latitude >= 44.00 
    AND   CheckinTable.latitude <= 41.00 
    AND   CheckinTable.longitude >= 9.18 
    AND   CheckinTable.longitude <= 9.44 
    ORDER BY  CheckinTable.modified DESC) p 
WHERE the_row_number = 1 

참고. where 절의 기준이 해당 사용자에 대해 아무것도 반환하지 않으면 분명히 결과가 나타나지 않습니다.