MySQL – 控制哪个行由组返回

我有这样的数据库表:

id version_id field1 field2 1 1 texta text1 1 2 textb text2 2 1 textc text3 2 2 textd text4 2 3 texte text5 

如果你没有做到这一点,它包含了一些行的版本,然后是一些文本数据。

我想要查询它并返回每个ID最高的版本。 (所以第二行和最后一行只在上面)。

我已经尝试使用group by,同时通过version_id DESC进行sorting – 但似乎是在分组之后进行sorting,所以这不起作用。

任何人有任何想法? 我不敢相信这是做不到的!

更新:

拿出来,这是有效的,但使用子查询:

 SELECT * FROM (SELECT * FROM table ORDER BY version_id DESC) t1 GROUP BY t1.id 

这就是所谓的select一个列的组合最大值。 这里有几种不同的mysql方法。

以下是我将如何做到这一点:

 SELECT * FROM (SELECT id, max(version_id) as version_id FROM table GROUP BY id) t1 INNER JOIN table t2 on t2.id=t1.id and t1.version_id=t2.version_id 

这将是相对高效的,但MySQL将在子查询的内存中创build一个临时表。 我假设你已经有了这个表的(id,version_id)的索引。

这是SQL的一个缺陷,你或多或less必须使用子查询来解决这类问题( 半连接是另一个例子)。

子查询在mysql中没有得到很好的优化,但是不相关的子查询并没有那么糟糕,只要它们不是太大以至于它们会被写入磁盘而不是内存。 鉴于在这个查询中只有两个整数,子查询可能在发生之前就有数百万行,但是第一个查询中的select *子查询可能很快就会遭受这个问题的困扰。

我认为这样做,不知道它是最好的还是最快的。

 SELECT * FROM table WHERE (id, version_id) IN (SELECT id, MAX(version_id) FROM table GROUP BY id) 
 SELECT id, version_id, field1, field2 FROM ( SELECT @prev = id AS st, (@prev := id), m.* FROM ( (SELECT @prev := NULL) p, ( SELECT * FROM mytable ORDER BY id DESC, version_id DESC ) m ) m2 WHERE NOT IFNULL(st, FALSE); 

没有子查询,如果你有一个(我认为你应该) UNIQUE INDEX ON MYTABLE (id, version_id)上传递一个UNIQUE INDEX ON MYTABLE (id, version_id)

我通常使用子查询来做到这一点:

从datatable中selectid,version_id,field1,field2作为dt其中id =(从datatable中selectid,其中id = dt.id order by version_id desc limit 1)

这是伪代码,但这样的事情应该工作得很好

 select * from table inner join ( select id , max(version_id) maxVersion from table ) dvtbl ON id = dvtbl.id && versionid = dvtbl.maxVersion 

这个查询将通过以下方式完成没有组的工作:

 SELECT * FROM table AS t LEFT JOIN table AS t2 ON t.id=t2.id AND t.version_id < t2.version_id WHERE t2.id IS NULL 

它不需要任何临时表。

我想这是你想要的。

 select id, max(v_id), field1, field2 from table group by id 

我从中得到的结果是

1,2,textb,text2

2,3,texte,text5

编辑:我重新创build表,并插入相同的数据与id是version_id是一个复合主键。 这给了我之前提供的答案。 这也是在MySQL中。

没有testing过,但这样的事情可能会工作:

SELECT * FROM表GROUP BY ID ORDER BY MAX(version_id)DESC