下面是我有什么
+++++++++++++++++++++++++++
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
为巴兹 ,而不是酒吧即将到来的name
日期2012-06-04
是吧 。
演示测试数据。
你抢
- 的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
,或随机如果像你一样你不指定任何东西。
为了您的具体问题,所有u需要做的是应用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)
如果想要可确定性的结果集,你需要告诉应用到组什么度算法的软件。 一些例如:
- MIN
- MAX
- 计数
- 和
等等等等。
在你的情况下,U不适用确定性度算法的name
领域,使u得到来自设备的“随机”的结果。