Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 复杂的SQL联接查询-获取最新行_Mysql_Join_Subquery_Groupwise Maximum - Fatal编程技术网

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

Mysql 复杂的SQL联接查询-获取最新行,mysql,join,subquery,groupwise-maximum,Mysql,Join,Subquery,Groupwise Maximum,mymysqldb有一个表(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

mymysqldb有一个表(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

使用带有
分组依据的子查询,计算每个
名称的最大
id

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)上使用索引

这只是未经测试的徒手,但我想你明白了。这假定列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 
select name, data
from cfg
where id in (select max(id) from cfg where location = "dc" group by name)