2011-12-23 63 views
1

我的MySQL数据库有一个包含4个字段的表(cfg):id,名称,数据和位置 这一个表用于服务几个子域(位置)。我需要获取给定子域(位置)的每个名称的最新行列表。复杂的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 

它会返回

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

回答

2

使用子查询与GROUP BY,计算最大。 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 2011-12-24 16:47:53

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)的使用上(位置,名称,ID)和一个索引

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

这只是未经检验的写意,但我想你明白了。这假设列ID是唯一的。