复杂的SQL连接查询 - 获取最新的行
问题描述:
我的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
答
使用子查询与GROUP BY
,计算最大。 id
每name
:
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
答
我觉得
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)和一个索引
答
select name, data
from cfg
where id in (select max(id) from cfg where location = "dc" group by name)
这只是未经检验的写意,但我想你明白了。这假设列ID是唯一的。
非常感谢。这个窍门! – Nathan 2011-12-24 16:47:53