精华内容
下载资源
问答
  • mysql分组查询取第一条数据 在做项目时遇到了,mysql分组查询取第一个的需求 表结构如下 需求是根据code分组,取每组中版本号最大的数据 方案一 SELECT t.* FROM ( SELECT code, max( version ) AS version...

    mysql分组查询取第一条数据

    在做项目时遇到了,mysql分组查询取第一个的需求
    表结构如下
    表结构

    需求是根据code分组,取每组中版本号最大的数据
    方案一

    SELECT
    	t.* 
    FROM
    	(
    	SELECT
    		code,
    		max( version ) AS version 
    	FROM
    		test_table 
    	WHERE
    		`status` = 1 
    		AND is_deleted = 0 
    	GROUP BY
    	code
    	) a
    	LEFT JOIN test_table t ON  t.code = a.code 
    	AND t.version = a.version
    

    查询结果:(注意,我这里通过status和is_deleted字段进行了过滤,最新版本查询是基于满足这两个字段的条件下进行的)
    查询结果

    方案二
    网上查找的解决方案如下

    select t.* from (
       select e.* from test_table e where e.`status` = 1 
       	AND e.is_deleted = 0  order by e.version limit 1000
    ) t group by t.code
    

    这种方法会报错
    1055 - Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggregated column ‘t.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 版本及以上版本会出现的问题:mysql 5.7版本默认的sql配置是:sql_mode=“ONLY_FULL_GROUP_BY”,这个配置严格执行了"SQL92标准"。
    很多从5.6升级到5.7时,为了语法兼容,大部分都会选择调整sql_mode,使其保持跟5.6一致,为了尽量兼容程序。
    二、sql层面
    在sql执行时,出现该原因:简单来说就是:输出的结果是叫target list,就是select后面跟着的字段,还有一个地方group by column,就group by后面跟着的字段。由于开启了ONLY_FULL_GROUP_BY的设置,所以如果一个字段没有在target list和group by字段中同时出现,或者是聚合函数的值的话,那么这条sql查询是被mysql认为非法的,会报错误。

    首先去查看 sql_mode

    select @@GLOBAL.sql_mode;
    

    解决方案一:sql语句暂时性修改sql_mode,mysql重启后,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配置文件,通过手动添加sql_mode的方式强制指定不需要ONLY_FULL_GROUP_BY属性,my.cnf位于etc文件夹下,vim下光标移到最后,添加如下:

    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,建议生产环境可以先用sql修改,再同步的改配置文件,这样就无需重启数据库,另外在下一次重启后,就可以直接读取新的配置,无需担心sql修改失效的问题了

    PS:其实针对于上述需求,个人建议更好解决方案是:
    1)在表中加一个是否为最新版本字段,每次存入新版本时,将此字段更新为是,将老版本字段更新为否,这样即可实现上述需求,并且查询效率将大大提高
    2)另外,如果新老版本的数据是可以分开存储的,还是建议分表,将老版本数据存到历史表中,这样新老版本分开,对于大数据量,并且老版本数据不常用的业务场景,是极为合适的,总之,根据具体业务场景,选择适合自己的解决方案才是最重要的。

    展开全文
  • 通用:SELECT user_id FROM dd_circle_member WHERE circle_id=2927 ORDER BY RAND() LIMIT 1 但是效率低 下面的效率较高 SELECT user_id FROM `dd_circle_member` WHERE member_id >= (SELECT floor( RAND() *...

    通用:SELECT user_id FROM dd_circle_member WHERE circle_id=2927 ORDER BY RAND() LIMIT 1 

    但是效率低 下面的效率较高

     SELECT user_id FROM `dd_circle_member`
    WHERE member_id >= (SELECT floor( RAND() * ((SELECT MAX(member_id) FROM `dd_circle_member`)-(SELECT MIN(member_id) FROM `dd_circle_member`)) + (SELECT MIN(member_id) FROM `dd_circle_member`)))  and circle_id=2927 
    ORDER BY member_id LIMIT 1;

    展开全文
  • mysql取分组的第一条

    2021-04-06 11:09:16
    t_test按照p_id分组,并获取组内表最新创建的数据 SELECT a.name FROM ( SELECT * FROM t_test ORDER BY create_time desc LIMIT 10000) a ...== 这里注意:MYSQL5.7版本的子查询的排序需要加LIMIT排序才有效 ==

    t_test按照p_id分组,并获取组内最新创建的数据

    SELECT
    	a.name 
    FROM
    	( SELECT * FROM t_test ORDER BY create_time desc LIMIT 10000 ) a 
    GROUP BY
    	p_id
    

    这里注意:MYSQL5.7版本的子查询的排序需要加LIMIT排序才有效

    展开全文
  • 比如每个班级成绩第一的学生等等 oracle 和 sqlserver支持函数,mysql不行 这里给一个粗暴的方法: 两个行数 GROUP_CONCAT(A ORDER BY B)和substring_index 思路: 1、GROUP_CONCAT(fA ORDER BY B) 按照...
    select row_number() over(partition by A order by B ) as rowIndex from table

    比如取每个班级成绩第一的学生等等

    oracle 和 sqlserver支持函数,mysql不行

    这里给一个粗暴的方法:

    两个行数

    GROUP_CONCAT(A ORDER BY B)和substring_index

    思路:

    1、GROUP_CONCAT(fA ORDER BY B) 按照条件排序后拼装字段,默认逗号,4“,”分隔

    2、substring_index 取第一个逗号前的数,如果按照成绩降序排列,就能取到第一名的
    substring_index(GROUP_CONCAT(f.id ORDER BY f.dzrq DESC,fz.faid desc),',',1)

    涉及复杂的逻辑可能需要自定义函数了

    展开全文
  • Mysql取分组后的每组第一条数据 gruop by 分组后 进行 order by mysql会按照 先分组后排序的形式进行输出 并不能做到每组中的第一条数据取出。 我的思路是 : 先将要查询的数据表转换成已经排序的临时表 在进行 分组...
  • mysql group by 取第一条

    千次阅读 2019-03-27 10:24:00
    select * from table where id in (select max(id) from table group by sku) 说明:id是自增序列,sku是表中的个字段 转载于:https://www.cnblogs.com/gunduzi/p/10605742.html
  • mysql 分组取第一条数据

    万次阅读 2015-11-11 19:22:40
    select x, max(y) group by x ; so easy
  • 这里只介绍在表数据有顺序可排序(时间,数字大小等)的情况下的分组取第一或最后一条数据: https://blog.csdn.net/li_jian_fei/article/details/86162962
  • mysqlgroup by第一条数据

    万次阅读 2018-03-31 11:37:17
    mysqlgroup by第一条数据 示例数据(表enterprise_info) SELECT * FROM enterprise_info; id name gdp update_time 1 讯腾 240 2018/3/31 2:49 2 度百 120 2018/3/24 2:50 3 里阿...
  • MySQL取第一条数据方法:SQL语句分组的方法,使用Northwind 数据库为例子。   使用Northwind 数据库   首先查询Employees表     city列里面只有5个城市    使用ROW_NUMBER() OVER(PARTITION BY COL...
  • sql 排序 ROW_NUMBER() OVER 函数这是我之前写的sql排序函数,现在的需求是mysql 分组,组内排序并且取第一条数据。 mysql用子查询实现类似于row_number()函数的功能 场景: versionId=0时,是默认版本,即该条记录...
  • oracle和mysql分组排序取第一条数据

    千次阅读 2018-12-28 13:34:38
    按 员工号STAFF_ID 分组 按 时间START_TIME 排序 每个员工最新数据 select SUBSTRING_INDEX(group_concat(STAFF_ID order by START_TIME asc),',',1) as STAFF_ID,START_TIME from t_acc_user_accommodation...
  • 取MySQL结果集的第一条记录

    万次阅读 2018-09-15 10:39:18
    在SQL Server数据库中,使用top关键字:  SELECT TOP number|percent column_name(s) FROM table_name  在MySQL数据库中,使用LIMIT关键字:  SELECT column_name(s) FROM table_name LIMIT number  例子:...
  • mysql group by 函数 分组后排序取第一条数据 select aa.* from 你的操作的表名 as aa right join ( select 分组的那一列列名, max(排序的那一列列名+0) as max from 你的操作的表名 group by 分组的那一列列名 ...
  • select * from table_name where column_name=#{xxx} order by column_name limit 1 ; select * from table_name where column_name=#{xxx} order by ...比如 limit 3,是从查出来的结果中 前3数据; 而limit 0,3 是
  • mysql分组排序时间最近的第一条

    千次阅读 2020-04-29 10:30:03
    起因:需要对一张表数据进行分组排序,不同设备最新的一条更新记录,那么问题来了, 表数据经过简单Group By 之后,所获取到的 数据与期望数据不一致, 如图不同vem_id的最新一次的更新数据,常规group by 无法解决...
  • 第一的在分组排序后很容易得到,但排第二的就需要rank排序,而mysql没有内置的rank函数,要实现这个需求,就得自己实现 建表语句如下 CREATE TABLE `score_info` ( `class` varchar(20) DEFAULT NULL, `student...
  • 环境 MySQL:5.7 Java:1.8 SQL语句的写法: select * from (select distinct(a.id) tid, a.* from template_detail a ...思路:先进行排序,然后再进行分组,获取每组的第一条。 Q: 为什么要写distinct(a.i
  • 如何取MySQL结果集的第一条记录

    万次阅读 2018-08-15 11:49:13
    select top 1 * FROM SU_supplycontract t WHERE supplyContractCode="CRM20180813002" 以上这种写法不对 select * FROM SU_supplycontract t WHE...
  • MySql取第二高薪水

    2021-01-18 22:31:11
    MySql取第二高薪水 #(1) select Salary as SecondHighestSalary from Employee order by Salary desc #limit后面可以跟一个或俩个参数: #(1)只有一个参数时,默认取排序后最上面的一条 #(2)俩个参数时: #i.第一个...
  • 有一张这样的数据表, 需求是根据error_type分组然后status最小的第一条数据 第一种写法: select t.* from ( select e.* from error_record e where e.status > 0 and e.error_type > 0 order ...
  • 今天遇到一个问题,将...在group by的时候的是每一组的第一条; 实验二: 依旧是的该组的第一条数据 测试代码如下: DROP TABLE IF EXISTS `test0511`; CREATE TABLE `test0511` ( `id` int(11) NULL DEFA
  • mysql 随机取一条数据

    千次阅读 2018-05-19 15:06:57
    第一种办法:select * from 表名 order by rand( ) limit 1; //此处的1就是取出数据的数第二种办法SELECT * FROM user WHERE userId >= ((SELECT MAX(userId) FROM user )-(SELECT MIN(userId) FROM user...
  • 分组按时间正序取第一条记录, 巧妙地使用了not exists select d. * from t_charge d where not exists ( select 1 from t_charge where user_id = d. user_id and created_at < d....
  • 问题描述: 现有如下图所示数据库数据: ...首先使用分析函数row_number() over (partiion by … order by …)对数据进行分组编号,然后取出分组编号为1的数据,即需求中要第一条数据。 PARTITION BY

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 597
精华内容 238
关键字:

mysql取第一条

mysql 订阅