MySQL:具有最小日期的唯一行

MySQL:具有最小日期的唯一行,mysql,sql,filter,Mysql,Sql,Filter,假设我有下表: NAME DATE OTHER_CONTANT 'A' '2012-06-05' 'baz' 'A' '2012-06-04' 'bar' 'B' '2012-06-05' 'foo' 'C' '2012-06-05' 'bla' 'C' '2012-06-04' 'blah' 'C' '2012-06-06' 'bleh' 现在,我想筛选此表,使其仅包含具有唯一名称和最早日期的行: 'A' '2012-06-04' 'bar' 'B' '2012-06-05' 'foo'

假设我有下表:

NAME DATE OTHER_CONTANT

'A' '2012-06-05' 'baz'
'A' '2012-06-04' 'bar'
'B' '2012-06-05' 'foo'
'C' '2012-06-05' 'bla'
'C' '2012-06-04' 'blah'
'C' '2012-06-06' 'bleh'
现在,我想筛选此表,使其仅包含具有唯一名称和最早日期的行:

'A' '2012-06-04' 'bar'
'B' '2012-06-05' 'foo'
'C' '2012-06-04' 'blah'

我曾考虑使用GROUPBY语句,但使用GROUPBY只能得到一列作为结果,我希望得到整行。有没有关于如何进行此筛选的建议?

这两个查询都非常有效

SELECT * 
FROM   MyTable a 
       INNER JOIN (SELECT name, 
                          Min(date) AS date 
                   FROM   MyTable 
                   GROUP  BY name) b 
               ON a.name = b.name 
                  AND a.date = b.date


两个查询都可以完美地工作

SELECT * 
FROM   MyTable a 
       INNER JOIN (SELECT name, 
                          Min(date) AS date 
                   FROM   MyTable 
                   GROUP  BY name) b 
               ON a.name = b.name 
                  AND a.date = b.date


下面的SQL将创建所有不同名称的列表。然后,对于每个名称,它将查找具有最新日期的条目

select  *
from    (
        select  distinct name
        from    YourTable
        ) names
join    YourTable yt1
on      yt1.name = names.name
        and yt1.date =
        (
        select  date
        from    YourTable yt2
        where   yt2.name = yt1.name
        order by
                date
        limit   1
        )

下面的SQL创建了所有不同名称的列表。然后,对于每个名称,它将查找具有最新日期的条目

select  *
from    (
        select  distinct name
        from    YourTable
        ) names
join    YourTable yt1
on      yt1.name = names.name
        and yt1.date =
        (
        select  date
        from    YourTable yt2
        where   yt2.name = yt1.name
        order by
                date
        limit   1
        )

您可以使用以下选项:

select m.name, m.date, m.other_constant 
  from mytable m
  join (select name, min(date) min_date from mytable group by name) n
    on m.name = n.name and m.date = n.min_date

有关此信息,请参见。

您可以使用以下选项:

select m.name, m.date, m.other_constant 
  from mytable m
  join (select name, min(date) min_date from mytable group by name) n
    on m.name = n.name and m.date = n.min_date


有关此信息,请参见。

@mnowotka:您是否希望在输出中也包含
其他内容
?是的,确实如此,而且可能还有更多的列,我希望避免在我的查询中枚举它们的名称。@mnowotka:然后检查其他人的答案。beny23提供的小提琴正在工作。我将评估所有小提琴,并接受执行时间最短的有效小提琴。顺便说一句,讨论得很好。一个特定的名字能不止一次有相同的日期吗?@mnowotka:你想在你的输出中也包含
OTHER\u CONTANT
吗?是的,没错,也许还有更多的列,我想避免在我的查询中列举它们的名字。@mnowotka:然后检查其他人的答案。beny23提供的小提琴正在工作。我将评估所有小提琴,并接受执行时间最短的有效小提琴。顺便说一句,讨论得很好。一个特定的名字可以不止一次有相同的日期吗?+1对于SQL FIDLE,测试你的答案总是很好的+1对于SQL FIDLE,实际测试您的答案总是很好的!我不喜欢枚举内部查询中的所有列名。我不喜欢枚举内部查询中的所有列名。第一个列名似乎快得多。它可能取决于定义的索引。第一个列名似乎快得多。它可能取决于定义的索引。我不喜欢枚举内部查询中的所有列名。我不喜欢枚举内部查询中的所有列名。