min(列)没有返回其他列的正确数据

Fah*_*kar 2 mysql min

以下是我所拥有的

+++++++++++++++++++++++++++
id + myDate       + name
+++++++++++++++++++++++++++
'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'
+++++++++++++++++++++++++++
Run Code Online (Sandbox Code Playgroud)

我正在使用的查询是

SELECT id, min(myDate) as Date, name 
FROM myTable
GROUP BY id;
Run Code Online (Sandbox Code Playgroud)

我得到的输出如下

+++++++++++++++++++++++++++
id + myDate       + name
+++++++++++++++++++++++++++
'A'+ '2012-06-04' + 'baz'
'B'+ '2012-06-05' + 'foo'
'C'+ '2012-06-04' + 'bla'
+++++++++++++++++++++++++++
Run Code Online (Sandbox Code Playgroud)

我的问题是,当查询给我正确的日期时,为什么列的数据name将以baz而不是barname表示日期2012-06-04bar.

演示测试数据.

Gol*_*rol 5

你抓住了

  1. 身份证,
  2. 该ID的最低日期,和
  3. 与之相关的任何名称.

其他(普通)数据库甚至不允许此查询.他们会强迫你要么使用聚合函数的名称,或添加名字group by为好.相反,MySQL选择一个随机值,这就是你的问题.

要解决此问题,您的查询将变得更加复杂:

select
  t.id, 
  t.mydate,
  t.name
from
  myTable t
where
  t.mydate = 
    (select 
      min(td.mydate) 
    from 
      myTable td 
    where 
      td.id = t.id)
Run Code Online (Sandbox Code Playgroud)

要么:

select
  t.id, 
  t.mydate as date,
  t.name
from
  myTable t
  inner join 
    (select 
      td.id
      min(td.mydate) as date
    from 
      myTable td 
    group by 
      td.id) tx on tx.id = t.id and tx.date = t.mydate
Run Code Online (Sandbox Code Playgroud)