下面是我所拥有的
+++++++++++++++++++++++++++
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 作为日期2012-06-04
bar 的name
。
演示以测试数据。
你抓住
- ID,
- 该 ID 的最低日期,以及
- 与之相关的任何名称。
其他(普通)数据库甚至不允许此查询。他们会强迫您使用聚合函数作为名称,或者将名称也添加到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
您必须使用不同的查询,正如 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
现有查询未在名称列上指定约束,这就是无法获得预期结果的原因。 Group by
只创建一个集合,您可以使用 min
等函数从中获取值,或者如果您没有像以前那样指定任何内容,则可以随机获取值。
对于您的特定问题,您需要做的就是将 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)
如果你想要一个确定性的结果集,你需要告诉软件将什么算法应用于组。例如:
- 最低
- .MAX
- 计数
- 和
等等
等等在你的例子中,u没有将确定性算法应用于name
场,所以你从集合中得到一个"随机"结果。