2

以下是我所拥有的

+++++++++++++++++++++++++++
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'
+++++++++++++++++++++++++++

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

演示来测试数据。

4

3 回答 3

5

你抢

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

其他(正常)数据库甚至不允许此查询。他们会强迫您对name使用聚合函数,或者也将 name 添加到namegroup 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
于 2012-06-13T08:26:41.790 回答
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

于 2012-06-13T08:23:15.403 回答
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. 最小
  2. 最大限度
  3. 数数

等等等等

在您的情况下,您没有将确定性算法应用于该name领域,因此您从集合中获得了“随机”结果。

于 2012-06-13T08:29:57.037 回答