【问题标题】:MySQL: unique rows with minimal dateMySQL:具有最少日期的唯一行
【发布时间】:2012-06-13 18:22:13
【问题描述】:

假设我有下表:

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'

我正在考虑使用 GROUP BY 语句,但使用 GROUP BY 我只能获得一列作为结果,我想获得整行。有关如何进行此过滤的任何建议?

【问题讨论】:

  • @mnowotka : 你想要OTHER_CONTANT 也在你的输出中吗??
  • 是的,确切地说,也许还有更多的列,我想避免在我的查询中列举它们的名字。
  • @mnowotka :然后检查其他答案。 beny23提供的小提琴正在工作..
  • 我将评估所有这些并接受执行时间最短的有效的。顺便说一句,讨论很好。
  • 一个特定的名字可以有多次相同的日期吗?

标签: mysql sql filter


【解决方案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

另请参阅SQLfiddle

【讨论】:

  • +1 用于 SQL Fiddle,实际测试您的答案总是很高兴!
【解决方案2】:

以下 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
        )

Live example using beny23's SQL Fiddle.

【讨论】:

    【解决方案3】:

    两个查询都能完美运行。

    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 a.* 
    FROM   mytable a 
           LEFT JOIN mytable b 
                  ON a.name = b.name
                     AND a.date > b.date 
    WHERE  b.name IS NULL 
    

    【讨论】:

    • 第一个似乎要快很多。
    • 它可能取决于定义的索引。
    【解决方案4】:
    select *
    from (
       select name, min(date) as mindate, other_contact
       from table_name group by name
       ) as x
       inner join table_name as f 
       on f.name = x.name and f.date= x.mindate; 
    

    【讨论】:

    • 我不喜欢枚举内部查询中的所有列名。
    【解决方案5】:
    SELECT
        a.name,
        a.date,
        b.other_contant
    FROM
        (
            SELECT
                name,
                MIN(date) AS date,
            FROM
                yourtable
            GROUP BY 
                name
        ) a
    INNER JOIN
        yourtable b ON a.name = b.name AND a.date = b.date
    

    【讨论】:

    • 我不喜欢枚举内部查询中的所有列名。
    猜你喜欢
    • 2018-03-21
    • 1970-01-01
    • 2015-09-04
    • 1970-01-01
    • 2019-05-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多