GVKun编程网logo

Mysql group by 和 order by 效率问题(mysql中group by和order by)

2

关于Mysqlgroupby和orderby效率问题和mysql中groupby和orderby的问题就给大家分享到这里,感谢你花时间阅读本站内容,更多关于2.(groupby)如何让分组后,每组中的

关于Mysql group by 和 order by 效率问题mysql中group by和order by的问题就给大家分享到这里,感谢你花时间阅读本站内容,更多关于2.(group by)如何让分组后,每组中的数据按时间倒序排列(group by和 order by的分组按排列)、centos7 设置 mysql 自启动的配置文件中 [Service] User=mysql Group=mysql,user 和 group 这边的 mysql 是指的什么?centos 的登录用户名?、linux 上,mysql 使用聚合函数 group by 时报错:SELECT list is not in GROUP BY clause and contains nonaggre 的问题、mysql "group by"与"order by"的研究--分类中最新的内容等相关知识的信息别忘了在本站进行查找喔。

本文目录一览:

Mysql group by 和 order by 效率问题(mysql中group by和order by)

Mysql group by 和 order by 效率问题(mysql中group by和order by)

Mysql 在对大表进行查询的时候同时使用 group by 和 order by 的时候使用了 filesort 使得查询效率非常低,使用了索引也无法解决的,这样的 sql 该如何优化



2.(group by)如何让分组后,每组中的数据按时间倒序排列(group by和 order by的分组按排列)

2.(group by)如何让分组后,每组中的数据按时间倒序排列(group by和 order by的分组按排列)

 

 

比如说有表devicedata:

问题: 现在我想将devicedata这个表中的数据,先按device_id这个字段分组,然后每组中的数据按时间字段ts从大到小的排列, 如何解决呢?

错误的sql:首先分组,然后order by 排序, select * from devicedata GROUP BY device_id, id ORDER BY ts DESC,

但是这条sql查询得到的结果是:

结果是不仅没排序,而且也没分组。

再尝试一下:用子查询 先用order by将数据排序 然后将结果用group by分组,

select * from (select * from devicedata ORDER BY ts DESC) a GROUP BY a.device_id, a.id

结果:

结果是按device_id分组了, 可是组里面的数据没有按ts字段从大到小的排列,

所这样的sql还是没达到目的, 

最终正确的写法: 接下来正确的来了:select * from devicedata order by device_id, ts desc

结果:

这样就可以达到目的了,没想到吧,

 通过order by device_id, ts desc 我们可以将查询结果先按device_id分组, 再将每一组里面的按照ts字段降序(或升序)排列。

看这条sql你就明白了吧,当然肯定还有其他写法,这只是我这一刻想到的分享出来了, 大家如果有其他做法希望可以与我分享一下。

如有问题,望指教。

 

centos7 设置 mysql 自启动的配置文件中 [Service] User=mysql Group=mysql,user 和 group 这边的 mysql 是指的什么?centos 的登录用户名?

centos7 设置 mysql 自启动的配置文件中 [Service] User=mysql Group=mysql,user 和 group 这边的 mysql 是指的什么?centos 的登录用户名?

centos7 设置 mysql 自启动的配置文件中

[Unit]
Description=MySQL Server
Documentation=man:mysqld(8)
Documentation=http://dev.mysql.com/doc/refman/en/using-systemd.html
After=network.target
After=syslog.target

[Install]
WantedBy=multi-user.target

[Service]
User=mysql
Group=mysql
ExecStart=/usr/local/mysql/bin/mysqld --defaults-file=/etc/my.cnf
LimitNOFILE = 5000
#Restart=on-failure
#RestartPreventExitStatus=1
#PrivateTmp=false

这里的

[Service]

User=mysql

Group=mysql,

user 和 group 这边的 mysql 是指的什么?centos 的登录用户名?还是其他呢?

linux 上,mysql 使用聚合函数 group by 时报错:SELECT list is not in GROUP BY clause and contains nonaggre 的问题

linux 上,mysql 使用聚合函数 group by 时报错:SELECT list is not in GROUP BY clause and contains nonaggre 的问题

之前在 windows 上测试是可以正常使用的,但是上传到 Linux 上后,就报错:

Expression #2 of SELECT list is not in GROUP BY clause and contains 
nonaggregated column ‘sss.month_id’ which is not functionally 
dependent on columns in GROUP BY clause; this is incompatible with 
sql_mode=only_full_group_by

问题出现的原因:
MySQL 5.7.5 及以上功能依赖检测功能。如果启用了 ONLY_FULL_GROUP_BY SQL 模式(默认情况下),MySQL 将拒绝选择列表,HAVING 条件或 ORDER BY 列表的查询引用在 GROUP BY 子句中既未命名的非集合列,也不在功能上依赖于它们。(5.7.5 之前,MySQL 没有检测到功能依赖关系,默认情况下不启用 ONLY_FULL_GROUP_BY。有关 5.7.5 之前的行为的说明,请参见 “MySQL 5.6 参考手册”。)

解决方法一:

打开 navcat,

用 sql 查询:

select @@global.sql_mode

运行结果:

ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION

去掉 ONLY_FULL_GROUP_BY,重新设置值。

set @@global.sql_mode 
  =''STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION'';

 

mysql

mysql "group by"与"order by"的研究--分类中最新的内容

这两天让一个数据查询难了。主要是对group by 理解的不够深入。才出现这样的情况
这种需求,我想很多人都遇到过。下面是我模拟我的内容表
复制代码 代码如下:

CREATE TABLE `test` (
`id` INT(10) NOT NULL AUTO_INCREMENT,
`name` VARCHAR(255) NOT NULL,
`category_id` INT(10) NOT NULL,
`date` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (`id`)
)
ENGINE=MyISAM
ROW_FORMAT=DEFAULT;
INSERT INTO `test` (`id`, `name`, `category_id`, `date`)
VALUES
(1, ''aaa'', 1, ''2010-06-10 19:14:37''),
(2, ''bbb'', 2, ''2010-06-10 19:14:55''),
(3, ''ccc'', 1, ''2010-06-10 19:16:02''),
(4, ''ddd'', 1, ''2010-06-10 19:16:15''),
(5, ''eee'', 2, ''2010-06-10 19:16:35'');


我现在需要取出每个分类中最新的内容
复制代码 代码如下:

select * from test group by category_id order by `date`

结果如下

明显。这不是我想要的数据,原因是msyql已经的执行顺序是

引用

写的顺序:select ... from... where.... group by... having... order by..
执行顺序:from... where...group by... having.... select ... order by...

所以在order by拿到的结果里已经是分组的完的最后结果。
由from到where的结果如下的内容。

到group by时就得到了根据category_id分出来的多个小组


到了select的时候,只从上面的每个组里取第一条信息结果会如下

即使order by也只是从上面的结果里进行排序。并不是每个分类的最新信息。
回到我的目的上 --分类中最新的信息
根据上面的分析,group by到select时只取到分组里的第一条信息。有两个解决方法
1,where+group by(对小组进行排序)
2,从form返回的数据下手脚(即用子查询)

由where+group by的解决方法
对group by里的小组进行排序的函数我只查到group_concat()可以进行排序,但group_concat的作用是将小组里的字段里的值进行串联起来。
select group_concat(id order by `date` desc) from `test` group by category_id


再改进一下
select * from `test` where id in(select SUBSTRING_INDEX(group_concat(id order by `date` desc),'','',1) from `test` group by category_id ) order by `date` desc



子查询解决方案
select * from (select * from `test` order by `date` desc) `temp`  group by category_id order by `date` desc


 

您可能感兴趣的文章:
  • MySQL group by和order by如何一起使用
  • mysql中count(), group by, order by使用详解
  • 深度分析mysql GROUP BY 与 ORDER BY
  • mysql中order by与group by的区别
  • 深入解析mysql中order by与group by的顺序问题
  • Mysql中order by、group by、having的区别深入分析
  • mysql分组取每组前几条记录(排名) 附group by与order by的研究
  • MySQL order by与group by查询优化实现详解

关于Mysql group by 和 order by 效率问题mysql中group by和order by的问题就给大家分享到这里,感谢你花时间阅读本站内容,更多关于2.(group by)如何让分组后,每组中的数据按时间倒序排列(group by和 order by的分组按排列)、centos7 设置 mysql 自启动的配置文件中 [Service] User=mysql Group=mysql,user 和 group 这边的 mysql 是指的什么?centos 的登录用户名?、linux 上,mysql 使用聚合函数 group by 时报错:SELECT list is not in GROUP BY clause and contains nonaggre 的问题、mysql "group by"与"order by"的研究--分类中最新的内容等相关知识的信息别忘了在本站进行查找喔。

本文标签:

上一篇mysql 安装和卸载(mysql安装和卸载)

下一篇Dada selects MySQL Enterprise Unlimited to handle over 7 million online subscribers