Mysql 获取最大字段值等于x的行

Mysql 获取最大字段值等于x的行,mysql,sql,Mysql,Sql,假设我在mysql数据库中有这样一个表: Id number version date 1 123 1 2016-01-12 2 123 2 2016-01-13 3 124 1 2016-01-14 4 124 2 2016-01-15 5 124 3 2016-01-16 6 1

假设我在mysql数据库中有这样一个表:

Id    number    version    date
1     123       1          2016-01-12
2     123       2          2016-01-13
3     124       1          2016-01-14
4     124       2          2016-01-15
5     124       3          2016-01-16
6     125       1          2016-01-17
我想获取表中的所有行,其中version字段中的值是每个相应的数字的最大值。例如,我希望获得以下输出:

Id    number    version    date
2     123       2          2016-01-13
5     124       3          2016-01-16
6     125       1          2016-01-17
我试过这样的方法:

SELECT * FROM myTable WHERE version = (SELECT MAX(version) FROM myTable)
但是上面的查询返回空的


请帮忙

您应该在子句和group by中使用

原版

SELECT * FROM myTable 

WHERE (version, number) in 
      (SELECT MAX(version), number FROM myTable group by number)
已编辑版本一

SELECT * FROM myTable 
inner join myTable2 on myTable.id = myTable2.mytable_id
WHERE (version, number) in 
      (SELECT MAX(version), number FROM myTable group by number)

这里有几个选择,还有小提琴。每一行只选择其关联的
编号具有最大版本的行

以下是一个(可能更好)的版本:

用这个

select * 
from myTable 
     natural join 
     (select max(version) as version, number from myTable group by number) as T;
这是我的错



这很好

如果每个
数字
都没有相同的最大版本,则会出现严重问题。如果数字不同,则此查询也会工作。再次检查Fiddle否否,如果我们对不同的数字有不同的版本,则会失败(请参见编辑的表格)请将其作为不同的问题发布。我已经回答了你原来的问题。这将成为一个不同的问题。好的,我将把它作为一个新问题发布。如果你还有其他问题,请将它作为一个新问题发布。就像@geeksal所说的,这样“爬行”你的问题范围是不合适的。我已经前进并后退了。@user765368也请将答案标记为accepted@CollinD谢谢,只是一个输入错误,即使我提到了数字是select查询,也忘了提到group by子句……我很急着回答另一个问题:)这对数百万行来说有多有效?@user765368我说不清楚,但它是一个获得结果的非常简单的方法。。。。。。。关于效率和复杂性,我还需要学习很多东西。所以,如果您有一些东西要共享,那就继续吧。如果myTable已经与另一个表连接,这不会导致问题吗?如果我想在myTable上放置一些条件,我会将我的条件放在哪里,在as T之后?除非它具有相同的列名,但具有不同的语义(例如,学生表中的dept_名称与课程中的dept_名称具有不同的语义)(在这种情况下,它可能导致错误的联接)。对于第二部分,您可以将where条件放在后面,这与您的常规SQL语法不同,它肯定会起作用,因为如果R(A,B)自然连接S(A,C,D),那么您将得到结果(A,B,C,D),但元组在R和S中都具有匹配的公共值。这对数百万行有多大的效率?我不确定。实际上,只要
number
version
是索引,就不会太糟糕(反正是第二个),因为它只运行子查询一次。我不能确定,但我怀疑@geeksal的解决方案与
连接
更有效。可能值得进行一些测试(或者对较低级别的SQL知识稍有了解的人可以回答)。第一个在每行上运行子查询(我相信),实际上不应该使用。这主要是为了表现一种天真的态度。@CollinD。。。是的,我忘了号码。。现在是正确的,它不起作用。它两次返回数字123的行(参见此小提琴)您有两个与表2匹配的id。。。就是为了这个你有两次的时间排。。。请更好地解释表1和表2之间的关系……您是否也希望表2的最大值?
select * from releases 
where (version, number) in (
  select max(version), number 
  from releases 
  group by number
);
select * 
from myTable 
     natural join 
     (select max(version) as version, number from myTable group by number) as T;
SELECT * FROM demo WHERE version = (SELECT MAX(version) FROM demo)