复杂的 SQL 连接查询 - 获取最新行
Posted
技术标签:
【中文标题】复杂的 SQL 连接查询 - 获取最新行【英文标题】:Complicated SQL join query - get newest row 【发布时间】:2012-01-27 01:48:01 【问题描述】:我的 mysql 数据库有一个包含 4 个字段的表 (cfg):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
【问题讨论】:
【参考方案1】:select name, data
from cfg
where id in (select max(id) from cfg where location = "dc" group by name)
这只是未经测试的手绘,但我想你明白了。这假定列 id 是唯一的。
【讨论】:
【参考方案2】:我认为
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
在 (location, name, id) 上使用一个索引,在 (id) 上使用一个索引
【讨论】:
【参考方案3】:使用带有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
【讨论】:
以上是关于复杂的 SQL 连接查询 - 获取最新行的主要内容,如果未能解决你的问题,请参考以下文章