复杂的SQL连接查询 - 获取最新的行

时间:2011-12-23 20:47:36

标签: mysql join subquery groupwise-maximum

我的MySQL数据库有一个表(cfg),包含4个字段:id,name,data和location 这一个表是为几个子域(位置)提供服务。我需要获取给定子域(位置)的每个名称的最新行列表。

示例数据

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

3 个答案:

答案 0 :(得分: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

答案 1 :(得分: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)

上使用索引

答案 2 :(得分:0)

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

这只是未经考验的写意,但我认为你明白了。这假设列id是唯一的。