您的位置:首页 > 理论基础 > 计算机网络

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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: