关于MySQL group by的问题
问题描述
表字段及数据:idamountuser_idcreate_time110012016-10-11 10:59:332300022016-10-10 10:59:543325612016-10-09 11:00:164154612016-10-08 11:00:38我想取每个user的第一条记录,SQL:select * from test group by user_id.
结果:idamountuser_idcreate_time110012016-10-11 10:59:332300022016-10-10 10:59:54然后我发现如果根据时间来排序,无论是顺序还是逆序他都是这个结果,然后我猜想这个结果是不是根据id的大小来的,结果我改了id也是一样,然后我猜想group by 结果是根据记录添加顺序来决定的,当group by的字段出现重复时,只会取第一条记录,不知道这样对不对,求解答?
问题解答
回答1:不加create_time也一样只是因为你的记录中的顺序已经是规律的了,什么排序也没有的前提下,其实group by以后取出只是所有记录中user_id第一次出现的记录
回答2:你所谓的“第一条记录”是按照什么顺序的“第一”呢?数据库的表本身并不预设某种顺序。假设你是要按照id排序且id无重复:
select * from test where id in (select min(id) from test group by user_id);
应该可以达到目的。
回答3:group by是按主键顺序展示的结果。要展示最新的amount需要在在组内排序。
selet * from( select id,amount,user_id,create_time from test order by create_time desc) as t group by user_id回答4:
这样理解可以说错, 也可以说对.
说错是因为 按sql标准, 如果sql里面有分组, 只有分组列才是有效的数据.select * from test group by user_id. 这行表示, 只有user_id这一列才是真数据, 别的列是假的, 即使选出来, 也不能用.
但是对于MySql, 他的行为就和你描述的一样.
相关文章:
1. html5 - echarts折线图 markline 数值怎么设置 不想用默认的average2. chrome浏览器怎么使用3. css - 关于图标字体4. javascript - 百度地图一开始设置了中心点,怎么通过按钮在调转到对应的中心点????5. python - 《flask web开发》中为什么发不出确认邮件?6. javascript - Tomcat突然就报错了,解析不了java文件,试过几个百度的解决方法,没解决。7. javascript - 百度echarts图表如何修改8. objective-c - 类似微信单聊的功能,想把聊天记录直接存入Sqlite,怎么建表.9. 为什么HTML5规范中会包含一些和html无关的东西?如本地存储等。10. mysql中的全文索引支持词根检索吗?