以下是我的内容
+++++++++++++++++++++++++++
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来测试数据。
答案 0 :(得分:5)
你抓住
其他(普通)数据库甚至不允许此查询。它们会强制您使用名称的聚合函数,或者将名称添加到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)
如果你想要一个确定性的结果集,你需要告诉软件什么算法适用于该组。例如:
等等
在你的情况下,你没有对name
字段应用确定性算法,所以你从集合中得到“随机”结果。