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

时间:2012-06-13 08:05:25

标签: 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'
+++++++++++++++++++++++++++

我正在使用的查询是

SELECT id, min(myDate) as Date, name 
FROM myTable
GROUP BY id;

我的输出如下

+++++++++++++++++++++++++++
id + myDate       + name
+++++++++++++++++++++++++++
'A'+ '2012-06-04' + 'baz'
'B'+ '2012-06-05' + 'foo'
'C'+ '2012-06-04' + 'bla'
+++++++++++++++++++++++++++

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

Demo来测试数据。

3 个答案:

答案 0 :(得分:5)

你抓住

  1. id,
  2. 该ID的最低日期,
  3. 随附的任何名称。
  4. 其他(普通)数据库甚至不允许此查询。它们会强制您使用名称的聚合函数,或者将名称添加到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)
    

    或者:

    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
    

答案 1 :(得分:1)

您必须使用不同的查询,如DevArt指出的那样:

SELECT m.* from myTable m join
(select id, min(myDate) md from myTable group by id) mm
on m.id=mm.id and m.myDate=md

您现有的查询未在name列上指定约束,这就是您没有得到预期结果的原因。 Group by只会使用min之类的函数创建一个可以获取值的集合,或者如果您没有像以前那样指定任何内容,则会随机生成。

答案 2 :(得分:1)

对于您的具体问题,您需要做的就是将MIN函数应用于连接字段:

SELECT id, min(CONCAT(myDate,' ++ ',name)) as date_name 
FROM myTable
GROUP BY id;

并在服务器端脚本中处理它


您正在使用GROPU BY。这意味着结果中的每一行代表一个值。 其中一个值是组名称(按组分组的字段的值)。其余的是该组内的任意值 例如下表:

F1   |   F2
1         aa
1         bb
1         cc
2         gg
2         hh

如果您要按F1分组:SELECT F1,F2 from T GROUP BY F1 你会得到两行:

1    and one value from (aa,bb,cc)
2    and one value from (gg,hh)

如果你想要一个确定性的结果集,你需要告诉软件什么算法适用于该组。例如:

  1. MIN
  2. MAX
  3. COUNT
  4. SUM
  5. 等等

    在你的情况下,你没有对name字段应用确定性算法,所以你从集合中得到“随机”结果。