2011-12-23 3 views
1

내 MySQL 데이터베이스에는 ID, 이름, 데이터 및 위치의 4 개 필드가있는 테이블 (cfg)이 있습니다. 이 테이블은 여러 하위 도메인 (위치)에 서비스를 제공합니다. 주어진 하위 도메인 (위치)에 대한 각 이름의 최신 행 목록을 가져와야합니다.복잡한 SQL 조인 쿼리 - 최신 행을 얻으십시오

예 데이터

id name data location 
--------------------------- 
1 color red dc 
2 color blue dc 
3 size large sj 
4 color green sj 
5 size small dc 

다음 쿼리는 잘 작동하지만 너무 복잡하고 느린 것 같다. 누구 제안이 있습니까?

SELECT c1.name, c1.data 
FROM (SELECT * FROM cfg WHERE location = "dc") as c1 
LEFT JOIN (SELECT * FROM cfg WHERE location = "dc") as c2 ON (c1.name = c2.name 
AND c1.id < c2.id) 
WHERE c2.id IS NULL 

이 최대를 계산 GROUP BY

name  data 
-------------- 
color blue 
size  small 

답변

2

사용을 하위 쿼리를 반환합니다. idname 당 :

SELECT cfg.* 
FROM cfg 
JOIN (
    SELECT max(id) AS max_id 
    FROM cfg c0 
    WHERE location = 'dc' 
    GROUP BY name 
    ) n ON n.max_id = cfg.id 
+0

대단히 감사합니다. 이것은 트릭을했다! – Nathan

0

난 그냥 검증되지 않은 자유가 있다고

select c.name, c.data 
from cfg c 
join (
select max(id) id 
from cfg 
group by name 
where location = 'dc' 
) nameMaximums on nameMaximums.id = c.id 

을 생각하고 단지 (ID)에

0
select name, data 
from cfg 
where id in (select max(id) from cfg where location = "dc" group by name) 

를 (위치, 이름, ID) 및 하나에 인덱스를 사용 ,하지만 당신 생각을 생각합니다. 이것은 열 ID가 고유하다고 가정합니다.