mysql 试图排序后分组_group by 先排序再分组的问题

news/2024/7/5 15:08:59

group by 先排序再分组的问题

group是分组,想先排序如何办?

建一个表试试

--

-- 表的结构 `test`

--

CREATE TABLE IF NOT EXISTS `test` (

`id` int(11) NOT NULL AUTO_INCREMENT,

`name` varchar(16) NOT NULL,

`phone` int(11) NOT NULL,

PRIMARY KEY (`id`)

) ENGINE=MyISAM  DEFAULT CHARSET=utf8;

--

-- 导出表中的数据 `test`

--

INSERT INTO `test` (`id`, `name`, `phone`) VALUES

(1, 'a', 1234),

(2, 'a', 3333),

(3, 'b', 555),

(4, 'b', 6773),

(5, 'a', 743),

(6, 'c', 95434);

查询一下,

SELECT * FROM `test` group by name

得到

id     name     phone

1     a     1234

3     b     555

6     c     95434

但我们想得到id最大的name怎么办?

SELECT max(id),id,name,phone FROM test group by name

得到

max(id) id     name     phone

5     1     a     1234

4     3     b     555

6     6     c     95434

可以看到,虽然每个name的最大id得到了,但是,其他数据依然是每个name的第一行

用子查询

select * from (select * from test order by id desc) t group by name

得到

id     name     phone

5     a     743

4     b     6773

6     c     95434

这就是我们想要的结果了,但是,这种作法在行数非常多的情况下,相当于把整个表复制了一次,估计效率低.

那用这种子查询

select * from test t where id in  (select max(id) from test group by name)

得到

id     name     phone

4     b     6773

5     a     743

6     c     95434

然而,这种子查询因为用了in,在数量多的情况下,也许还更慢些?不确定,没时间测试

另外,还有一种方法,不过原理我也有些糊涂了,只是看网上有人这样作,

select * from test t inner join (select * from test order by id desc) t2 on t.id=t2.id group by t.name

得到

id     name     phone     id     name     phone

5     a     743     5     a     743

4     b     6773     4     b     6773

6     c     95434     6     c     95434

为了想提高效率,想到了视图,先按id desc排个视图,再group by name,岂不是相当于子查询?

CREATE VIEW `testv` AS select `test`.`id` AS `id`,`test`.`name` AS `name`,`test`.`phone` AS `phone` from `test` order by `test`.`id` desc;

视图建立了,再查询

SELECT * FROM `testv` group by name

结果竟然是

id     name     phone

1     a     1234

3     b     555

6     c     95434

和在原表用

SELECT * FROM `test` group by name

的结果一样.看来视图和真正的表毕竟是有区别的

补充:

上网再看了一下,原来第二种子查询方法网上不是那样的,尽管我那样写在这个例子上也成功了,但是,说不定其他表会错?没时间测试.网上的方法是

select * from test t inner join (select max(id) as id,name from test group by name) t2 on t.id=t2.id and t.name=t2.name

得到

id     name     phone     id     name

5     a        743          5     a

4     b       6773          4     b

6     c       95434         6     c

另外,把上面这些查询方法中的test表换成testv,都可以得到正确的结果,尽管order by有点不同.

上面的排序都只针对一个字段,两个及以上字段也可以采用类似于

select * from (select * from test order by id desc) t group by name

这样的方法,在子查询中可以多个字段来order by

下面删除原来的test,重建一下

--

-- 表的结构 `test`

--

CREATE TABLE IF NOT EXISTS `test` (

`id` int(11) NOT NULL AUTO_INCREMENT,

`name` varchar(16) NOT NULL,

`month` int(11) NOT NULL,

`serial` int(11) NOT NULL,

`other` varchar(20) NOT NULL,

PRIMARY KEY (`id`)

) ENGINE=MyISAM  DEFAULT CHARSET=utf8;

--

-- 导出表中的数据 `test`

--

INSERT INTO `test` (`id`, `name`, `month`, `serial`, `other`) VALUES

(1, 'a', 200807, 2, 'aaa1'),

(2, 'a', 200805, 2, 'aaa2'),

(3, 'b', 200805, 3, 'bbb3'),

(4, 'b', 200805, 4, 'bbb4'),

(5, 'a', 200805, 1, 'aaa5'),

(6, 'c', 200807, 5, 'ccc6'),

(7, 'b', 200807, 8, 'bbb7'),

(8, 'c', 200807, 3, 'ccc8'),

(9, 'a', 200805, 6, 'aaa9');

查询

select * from (select * from test order by month desc,serial desc) t group by name

得到

id     name     month     serial     other

1     a     200807     2     aaa1

7     b     200807     8     bbb7

6     c     200807     5     ccc6

换一下排序方式

select * from (select * from test order by month asc,serial desc) t group by name

得到

id     name     month     serial     other

9     a     200805     6     aaa9

4     b     200805     4     bbb4

6     c     200807     5     ccc6

都按我们的要求显示了结果

阅读(2252) | 评论(1) | 转发(0) |


http://www.niftyadmin.cn/n/4747377.html

相关文章

3sum java_[leetcode-15]3Sum(java)

问题描述:Given an array S of n integers, are there elements a, b, c in S such that a b c 0? Find all unique triplets in the array which gives the sum of zero.Note:Elements in a triplet (a,b,c) must be in non-descending order. (ie, a ≤ b ≤ …

java mongodb 关闭连接_Java中获取MongoDB连接的方法

首先是所需jar包,Maven中的配置如下:org.mongodbmongodb-driver3.4.1org.mongodbbson3.4.1org.springframework.dataspring-data-mongodb1.7.0.RELEASEorg.mongodbmongo-java-driver3.9.1获取连接的代码如下(本中用的是模板类):List addrs n…

用思维导图学习java_用思维导图纪录Java学习过程

之前小编我给大家分享过一些Java学习相关的图片,比如 Java入门三张图够吗 ,这种图正是大名鼎鼎的思维导图。思维导图又叫心智导图是表达发散性思维的有效的图形思维工具 ,它简单却又极其有效,是一种革命性的思维工具。思维导图运用…

apparmor mysql_apparmor 引起自定义mysql 日志问题

今天手贱,看到mysql 的日志在/var/log/mysql下面。总是觉得别扭,于是就想改变日志的位置,本人开发环境 vagrant ubuntu12.04 ,在/etc/mysql/mysql中修改了general_log的位置,放在/data/logs/mysql下面然后重启服务,s…

java extjs4 分页_ExtJs4 SpringMvc3 实现Grid 分页

新建一个Maven webapp项目,webxml以及spring配置没什么需要注意的,不再赘述。Maven依赖:(个人习惯,有用没用的都加上。。。)4.0.0zp.testextjswar0.0.1-SNAPSHOTextjs Maven Webapphttp://maven.apache.orgjunitjunit4.7testjstlj…

正则表达式判断是否mac地址 java_使用正则表达式判断字符串是否为MAC地址

今天Boss给了一个小任务,要求给定一个字符串,判断该字符串是否是MAC地址,并用Java和正则表达式实现。于是我顺便百度了下MAC地址,并在cmd下使用getmac获取本机的MAC地址,了解了一点后,就用Java实现了。为了…

java语言学习要点_菜鸟入门:Java语言学习六大要点

原标题:菜鸟入门:Java语言学习六大要点Java的学习是比较复杂的,主要表现在相关的一系列平台、规范和协议上。有经验的Java程序员都知道,只掌握了Java语言本身很难开发应用程序。不讨论这些复杂的概念,而是我是参加的培…

java终止正在运行的线程_Java再学习——停止一个正在运行的线程

关于这个问题,先了解一下Thread类方法中被废弃的那些方法。suspend(), resume(),stop()/stop(Throwable obj),destroy()首先,stop(Throwable obj)和destroy()方法在最新的Java中直接就不支持了,没必要去看了。我们只需瞧瞧suspend(), resume(…