Group by 后如何保持原先的排序?

ci1699 2011-10-24 06:04:18
用Group by后。排序会从小到大排了。原先的顺序都变了。

用distinct也一样。

有没方法Group by 后保持原先的排序?
...全文
1774 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
ci1699 2011-10-25
  • 打赏
  • 举报
回复
ok。这个得了。没想到后面还用这么排序一次。
结贴。谢谢各位了

[Quote=引用 17 楼 acmain_chm 的回复:]

select *
from (
select *
from (select * from table1 order by sl_type ASC, obj_id_sum DESC , sl_percentage_sum DESC , sl_density_sum DESC) v
group by obj_id
) t
order by sl_type ASC, obj_id_su……
[/Quote]
ACMAIN_CHM 2011-10-25
  • 打赏
  • 举报
回复
select *
from (
select *
from (select * from table1 order by sl_type ASC, obj_id_sum DESC , sl_percentage_sum DESC , sl_density_sum DESC) v
group by obj_id
) t
order by sl_type ASC, obj_id_sum DESC , sl_percentage_sum DESC , sl_density_sum DESC
ci1699 2011-10-25
  • 打赏
  • 举报
回复
我原先也想这么弄。:(
但这样达不到要求。因为第一次obj_id GROUP BY后sl_type会合并了。排序不对了。

[Quote=引用 15 楼 acmain_chm 的回复:]

select *
from (
select *
from table1
group by obj_id
) t
order by sl_type ASC, obj_id_sum DESC , sl_percentage_sum DESC , sl_density_sum DESC
[/Quote]
ACMAIN_CHM 2011-10-25
  • 打赏
  • 举报
回复
select *
from (
select *
from table1
group by obj_id
) t
order by sl_type ASC, obj_id_sum DESC , sl_percentage_sum DESC , sl_density_sum DESC
ci1699 2011-10-25
  • 打赏
  • 举报
回复
这结果是我ORDER BY sl_type ASC, obj_id_sum DESC , sl_percentage_sum DESC , sl_density_sum DESC 后的啊。但有重复的obj_id。我想排除掉。


+-------+--------+---------+--------+---------------+------------+---------+------------+-------------------+----------------+
| sl_id | obj_id | objc_id | sw_id | sl_percentage | sl_density | sl_type | obj_id_sum | sl_percentage_sum | sl_density_sum |
+-------+--------+---------+--------+---------------+------------+---------+------------+-------------------+----------------+
| 298 | 13 | 1224 | 131676 | 12.50 | 0.00 | 1 | 2 | 37.50 | 0.00 |
| 306 | 6 | 1069 | 138528 | 12.50 | 0.00 | 1 | 2 | 29.17 | 0.00 |
| 239 | 11 | 1224 | 211201 | 11.11 | 0.00 | 1 | 2 | 22.22 | 0.00 |
| 58 | 4 | 74 | 131676 | 4.00 | 0.00 | 1 | 2 | 8.00 | 0.00 |
| 4 | 1 | 1224 | 211201 | 57.14 | 0.00 | 1 | 1 | 57.14 | 0.00 |
| 100 | 7 | 1224 | 211201 | 25.00 | 0.00 | 1 | 1 | 25.00 | 0.00 |
| 266 | 12 | 1224 | 284696 | 12.50 | 0.00 | 1 | 1 | 12.50 | 0.00 |
| 166 | 9 | 1224 | 211201 | 11.11 | 0.00 | 1 | 1 | 11.11 | 0.00 |
| 114 | 8 | 1224 | 138528 | 11.11 | 0.00 | 1 | 1 | 11.11 | 0.00 |
| 307 | 14 | 1224 | 284696 | 7.69 | 0.00 | 1 | 1 | 7.69 | 0.00 |
| 78 | 5 | 1224 | 211201 | 5.56 | 0.00 | 1 | 1 | 5.56 | 0.00 |
| 253 | 11 | 1224 | 211201 | 10.71 | 0.00 | 2 | 2 | 21.42 | 0.00 |
| 334 | 14 | 1224 | 211201 | 5.00 | 0.00 | 2 | 2 | 7.86 | 0.00 |
| 129 | 8 | 1224 | 138528 | 1.39 | 0.00 | 2 | 2 | 5.56 | 0.00 |
| 204 | 10 | 1224 | 211201 | 2.33 | 0.00 | 2 | 2 | 4.66 | 0.00 |
| 170 | 9 | 1224 | 211201 | 13.89 | 0.00 | 2 | 1 | 13.89 | 0.00 |
| 276 | 12 | 1224 | 211201 | 5.00 | 0.00 | 2 | 1 | 5.00 | 0.00 |
+-------+--------+---------+--------+---------------+------------+---------+------------+-------------------+----------------+
17 rows in set (0.00 sec)


ACMAIN_CHM 2011-10-25
  • 打赏
  • 举报
回复
你需要一个用于排序的字段。 因为数据库本身并不保证每次select * from table 的输出顺序如果没有ORDER BY定义。
ci1699 2011-10-25
  • 打赏
  • 举报
回复
谢谢楼上几位。还是有些弄不懂。不是只有这两个字段的。我拿了份真实的数据过来了。
这数据是查询一sql得出的。


SELECT * , COUNT(obj_id) AS obj_id_sum , SUM( sl_percentage ) AS sl_percentage_sum, SUM( sl_density ) AS sl_density_sum FROM search_list WHERE sw_id IN ('284701','284696','138528','211201','131676') AND sl_type IN ( 1, 2 ) GROUP BY obj_id, sl_type ORDER BY sl_type ASC, obj_id_sum DESC , sl_percentage_sum DESC , sl_density_sum DESC


现在得到这下面的结果后我想排除掉objc_id重复的。但得以最上行为准且顺序不要变。
行不行的?


sl_id obj_id objc_id sw_id sl_percentage sl_density sl_type obj_id_sum sl_percentage_sum sl_density_sum
--------------------------------------------------------------------------------------
298 13 1224 131676 12.50 0.00 1 2 37.50 0.00
306 6 1069 138528 12.50 0.00 1 2 29.17 0.00
239 11 1224 211201 11.11 0.00 1 2 22.22 0.00
58 4 74 131676 4.00 0.00 1 2 8.00 0.00
4 1 1224 211201 57.14 0.00 1 1 57.14 0.00
100 7 1224 211201 25.00 0.00 1 1 25.00 0.00
266 12 1224 284696 12.50 0.00 1 1 12.50 0.00
166 9 1224 211201 11.11 0.00 1 1 11.11 0.00
114 8 1224 138528 11.11 0.00 1 1 11.11 0.00
307 14 1224 284696 7.69 0.00 1 1 7.69 0.00
78 5 1224 211201 5.56 0.00 1 1 5.56 0.00
253 11 1224 211201 10.71 0.00 2 2 21.42 0.00
334 14 1224 211201 5.00 0.00 2 2 7.86 0.00
129 8 1224 138528 1.39 0.00 2 2 5.56 0.00
204 10 1224 211201 2.33 0.00 2 2 4.66 0.00
170 9 1224 211201 13.89 0.00 2 1 13.89 0.00
276 12 1224 211201 5.00 0.00 2 1 5.00 0.00
yq510457 2011-10-25
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 ci1699 的回复:]
CREATE TABLE IF NOT EXISTS `test` (
`a` int(11) NOT NULL,
`b` int(11) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1;



INSERT INTO `test` (`a`, `b`) VALUES
(1, 2),
(3, 2),
(2, 2),
(……
[/Quote]

你这个原先的排序具体指的是什么?

直接 SELECT * FROM `test`
把group by和 order by 都去掉不就是了。
wwwwb 2011-10-25
  • 打赏
  • 举报
回复
加入自增ID
SELECT * FROM TEST A WHERE NOT EXISTS (SELECT 1 FROM TEST WHERE A.B = B AND A.ID > ID)
OR
将2、1、0、3存入表中(LSB,字段ID自增),与GROUP后的结果连接,按ID排序
ACMAIN_CHM 2011-10-25
  • 打赏
  • 举报
回复
数据库原理中一个重要的论点就是集全中的记录是没有顺序的。 不能依赖数据库自己的排序。 你的原表中需要有个排序的字段以能确定原始顺序,比如加个ID序列。
现有表结构
CREATE TABLE IF NOT EXISTS `test` (
`a` int(11) NOT NULL,
`b` int(11) NOT NULL
)

无法实现这种排序功能。
ci1699 2011-10-25
  • 打赏
  • 举报
回复
SELECT * FROM `test` GROUP BY B怎么说不是标准的sql?

现在就是这样啊。有一批数据。排序已定像3楼的。
但b列有重复的。要去掉重复的。以最先的行为准。

像3楼。我想得到的数据是

(1, 2)
(6, 1)
(78, 0)
(16, 3)

[Quote=引用 5 楼 wwwwb 的回复:]

SELECT * FROM `test` GROUP BY B
不是标准的SQL语句,你要达到什么目的,贴出来看看
[/Quote]
wwwwb 2011-10-25
  • 打赏
  • 举报
回复
你要达到什么目的,贴出来看看
ci1699 2011-10-25
  • 打赏
  • 举报
回复
不行啊。~
[Quote=引用 4 楼 acmain_chm 的回复:]

SELECT * FROM `test` GROUP BY B order by 1
[/Quote]
wwwwb 2011-10-25
  • 打赏
  • 举报
回复
SELECT * FROM `test` GROUP BY B
不是标准的SQL语句,你要达到什么目的,贴出来看看
ACMAIN_CHM 2011-10-25
  • 打赏
  • 举报
回复
SELECT * FROM `test` GROUP BY B order by 1
yq510457 2011-10-25
  • 打赏
  • 举报
回复
学习~~~
ci1699 2011-10-25
  • 打赏
  • 举报
回复

CREATE TABLE IF NOT EXISTS `test` (
`a` int(11) NOT NULL,
`b` int(11) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1;



INSERT INTO `test` (`a`, `b`) VALUES
(1, 2),
(3, 2),
(2, 2),
(8, 2),
(6, 1),
(7, 2),
(11, 1),
(23, 1),
(78, 0),
(16, 3);


SELECT * FROM `test` GROUP BY B
后怎么保持原先的`a`字段的排序。不要打乱了。
rucypli 2011-10-24
  • 打赏
  • 举报
回复
select *
from tb
group by xxx
order by xxx
hllfl 2011-10-24
  • 打赏
  • 举报
回复
原先是什么顺序,没有什么顺序么
group by没顺序的,order by 吧

56,677

社区成员

发帖
与我相关
我的任务
社区描述
MySQL相关内容讨论专区
社区管理员
  • MySQL
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧