http://www.dewen.net.cn/q/16007/mysql查询如何先排序再分组呢
2016-03-10 15:28
507 查看
http://www.dewen.net.cn/q/16007/mysql查询如何先排序再分组呢
kwooshung
2 票
kwooshung 11
比如数据表“article”中有一组这样的数据:
id uid title
... .... .....
375 1 文章标题1
376 1 文章标题2
377 1 文章标题3
378 2 asdfasdf
379 3 fdaewqwe
... .... .....
然后我写了一句这样的sql:
select * from article order by id desc
执行后,结果如下:
id uid title
... .... .....
379 3 fdaewqwe
378 2 asdfasdf
377 1 文章标题3
376 1 文章标题2
375 1 文章标题1
... .... .....
然后我又加入了group by,为了只调用每个用户的1篇文章,sql代码如下
select * from article group by uid order by id desc
执行后,结果如下:
id uid title
... .... .....
379 3 fdaewqwe
378 2 asdfasdf
375 1 文章标题1
... .... .....
上面的数据看似正常,其实不对,因为先分组后排序了,所以我没法取得用户的最新文章了,始终是第一篇,正确的结果应该是:
id uid title
... .... .....
379 3 fdaewqwe
378 2 asdfasdf
377 1 文章标题3
... .... .....
这样才是取得用户的最新文章,并且过滤掉了用户的其他文章,因为如果页面上显示5条文章,不能有3条都是同一个人写的文章,应该这5条应该是最近发表文章的5个人的最新文章。
期间查询了很多技术资料,说用max或distinct的都不对,结果都是只显示第一篇文章。而且distnct更查询出来的结果顺序不对,更乱了。比如1,2,10,20,这几个id号变成了:
1
10
2
20
所以,想请教各路SQL大仙,看看应该怎么办呢?
当然,要求不能使用子查询。
brayden认证专家
2 票
brayden6562
首先 非大仙. 所以我认为只用一个简单 的sql满足不了你的需求.
select A.*
from article A,
(select max(id) mid from article group by uid) TMP
where A.id = TMP.mid;
再解释一下, 对标准sql来说, 用了group by, select/having/order by里只能有(group by的那个column, 或者聚集函数). 就是说select name from table1 group by id; 是有问题的(我记得oracle会报错); 但是mysql会正常返回, 这个mysql有一个扩展, http://dev.mysql.com/doc/refman/5.0/en/group-by-extensions.html "The server is free to choose any value from each group, so unless they are the same, the values chosen are indeterminate."
所以对你的问题来说,
select * from article group by uid; 这步以后回来的已经是不确定的值了.
http://stackoverflow.com/questions/7594865/why-does-mysql-add-a-feature-that-conflicts-with-sql-standards
kwooshung
2 票
kwooshung 11
比如数据表“article”中有一组这样的数据:
id uid title
... .... .....
375 1 文章标题1
376 1 文章标题2
377 1 文章标题3
378 2 asdfasdf
379 3 fdaewqwe
... .... .....
然后我写了一句这样的sql:
select * from article order by id desc
执行后,结果如下:
id uid title
... .... .....
379 3 fdaewqwe
378 2 asdfasdf
377 1 文章标题3
376 1 文章标题2
375 1 文章标题1
... .... .....
然后我又加入了group by,为了只调用每个用户的1篇文章,sql代码如下
select * from article group by uid order by id desc
执行后,结果如下:
id uid title
... .... .....
379 3 fdaewqwe
378 2 asdfasdf
375 1 文章标题1
... .... .....
上面的数据看似正常,其实不对,因为先分组后排序了,所以我没法取得用户的最新文章了,始终是第一篇,正确的结果应该是:
id uid title
... .... .....
379 3 fdaewqwe
378 2 asdfasdf
377 1 文章标题3
... .... .....
这样才是取得用户的最新文章,并且过滤掉了用户的其他文章,因为如果页面上显示5条文章,不能有3条都是同一个人写的文章,应该这5条应该是最近发表文章的5个人的最新文章。
期间查询了很多技术资料,说用max或distinct的都不对,结果都是只显示第一篇文章。而且distnct更查询出来的结果顺序不对,更乱了。比如1,2,10,20,这几个id号变成了:
1
10
2
20
所以,想请教各路SQL大仙,看看应该怎么办呢?
当然,要求不能使用子查询。
brayden认证专家
2 票
brayden6562
首先 非大仙. 所以我认为只用一个简单 的sql满足不了你的需求.
select A.*
from article A,
(select max(id) mid from article group by uid) TMP
where A.id = TMP.mid;
再解释一下, 对标准sql来说, 用了group by, select/having/order by里只能有(group by的那个column, 或者聚集函数). 就是说select name from table1 group by id; 是有问题的(我记得oracle会报错); 但是mysql会正常返回, 这个mysql有一个扩展, http://dev.mysql.com/doc/refman/5.0/en/group-by-extensions.html "The server is free to choose any value from each group, so unless they are the same, the values chosen are indeterminate."
所以对你的问题来说,
select * from article group by uid; 这步以后回来的已经是不确定的值了.
http://stackoverflow.com/questions/7594865/why-does-mysql-add-a-feature-that-conflicts-with-sql-standards
相关文章推荐
- http://www.dewen.net.cn/q/16042/jquery fadeIn和fadeOut问题
- http://www.dewen.net.cn/q/17095/SQL:用一条SQL语句统计出符合条件的内容
- http://www.dewen.net.cn/q/16222/C++排序中的sort函数第三个参数的疑问
- TCP/IP协议 1 ----实验楼转
- http://www.dewen.net.cn/q/15720/这样的情况一个sql语句怎么写
- 打造平安城市精品视频监控网络
- 浅谈HTTP中Get与Post的区别
- 使用802.1X+FreeRadius+LDAP实现网络准入方案
- node.js基础模块http、网页分析工具cherrio实现爬虫
- 判断安卓设备是否连接网络
- http 500错误详细代码意义
- iOS开发网络篇—数据缓存
- 关于HttpClient(调用openstack rest接口失败)
- TCP三次握手,四次挥手的状态变化
- Unity: C# TCP Client Server TcpListener NetworkStream UDP
- 【Android】【xUtils3网络下载图片的简单操作】
- Bitnami-Redmine通过https远程连接svn
- 可扩展,兼容多种网络请求框架的方案!!!
- 统计Apache的并发请求数及其TCP连接状态
- [转] 详解http和https的作用与区别