精华内容
下载资源
问答
  • 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)另外,如果新老版本的数据是可以分开存储的,还是建议分表,将老版本数据存到历史表中,这样新老版本分开,对于大数据量,并且老版本数据不常用的业务场景,是极为合适的,总之,根据具体业务场景,选择适合自己的解决方案才是最重要的。

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

    万次阅读 2015-11-11 19:22:40
    select x, max(y) group by x ; so easy

    select x, max(y) group by x ;

    so easy 

    展开全文
  • MySQL取第一条数据方法:SQL语句分组的方法,使用Northwind 数据库为例子。   使用Northwind 数据库   首先查询Employees表     city列里面只有5个城市    使用ROW_NUMBER() OVER(PARTITION BY COL...


    MySQL取第一条数据方法:SQL语句分组的方法,使用Northwind 数据库为例子。

     

    使用Northwind 数据库

     

    首先查询Employees表

     

     

    city列里面只有5个城市

     


     使用ROW_NUMBER() OVER(PARTITION BY COL1 ORDER BY COL2) 先进行分组 注:根据COL1分组,在分组内部根据 COL2排序,而此函数计算的值就表示每组内部排序后的顺序编号(组内连续的唯一的).

     


    sql语句为:

     


    select EmployeeID,LastName,FirstName,Title,TitleOfCourtesy,City,ROW_NUMBER() over(partition by City order by EmployeeID) as new_index

     from Employees

     

     

     

     

    执行结果图:

     

    可以看到是按照City分组,EmployeeID排序。

    select出分组中的第一条记录

     执行语句:

    select * from
    (select EmployeeID,LastName,FirstName,Title,TitleOfCourtesy,City,ROW_NUMBER() over(partition by City order by EmployeeID) as new_index
    from Employees) a where a.new_index=1

    执行结果图:

     

    来源:豆芽博客,地址:http://www.aichengxu.com/article/MySQL/933_10.html保留原文链接,是开源分享的开始.

    展开全文
  • 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:取group 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 里阿 340 2018/3/25 0:00
    4 里阿 460 2018/3/28 0:00
    5 里阿 530 2018/2/25 0:00
    6 里阿 450 2018/1/25 0:00
    7 讯腾 320 2018/1/12 0:00
    8 讯腾 435 2018/3/24 0:00
    9 讯腾 564 2018/2/15 0:00
    10 度百 435 2018/3/31 0:00
    11 度百 675 2018/2/22 0:00
    12 度百 232 2018/3/30 0:00

    数据说明:
    - 共有三个name:讯腾、度百、里阿
    - id与update_time不是正相关的关系

    目标

    获取三个name的最新数据,并插入到新表(n_enterprise_info)中

    步骤一:创建新表

    CREATE TABLE n_enterprise_info LIKE enterprise_info;

    步骤二:查询并插入结果

    INSERT INTO n_enterprise_info(name, gdp, update_time)  
        SELECT en.name, en.gdp, en.update_time FROM enterprise_info en 
        JOIN (
            SELECT name, max(update_time) up_time 
            FROM enterprise_info 
            GROUP BY name ORDER BY update_time DESC 
            ) tmp 
        ON en.name = tmp.name AND en.update_time = tmp.up_time;

    结果示例

    SELECT * FROM n_enterprise_info;
    id name gdp update_time
    1 讯腾 240 2018/3/31 2:49
    2 里阿 460 2018/3/28 0:00
    3 度百 435 2018/3/31 0:00
    展开全文
  • 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 是
  • oracle和mysql分组排序取第一条数据

    千次阅读 2018-12-28 13:34:38
    查每个人的Orderstr 是1数据,并保证name不重复 oracle select *  from (SELECT a.*, row_number() over(partition by ida order by orderstr) rn  FROM (select orderstr, name, ida from test) a ) where.....
  • 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...
  • 这里只介绍在表数据有顺序可排序(时间,数字大小等)的情况下的分组取第一或最后一条数据: https://blog.csdn.net/li_jian_fei/article/details/86162962
  • 一. 需求 ...当group by 支付订单表后, 默认取第一条数据, 而不是最近一 三. 解决 select t1.* from (select * from payment_order order by create_time desc limit 10000000000) t1 group...
  • 第一个:最简便性能最差的:
  • 问题描述: 现有如下图所示数据库数据: ...首先使用分析函数row_number() over (partiion by … order by …)对数据进行分组编号,然后取出分组编号为1数据,即需求中要第一条数据。 PARTITION BY
  • mysql分组后,每组第一条数据

    千次阅读 2021-05-06 19:56:41
    环境 MySQL:5.7 Java:1.8 SQL语句的写法: select * from (select distinct(a.id) tid, a.* from template_detail a ...思路:先进行排序,然后再进行分组,获取每组的第一条。 Q: 为什么要写distinct(a.i
  • ORDER BY rand()语句,这个语句可以实现任意条数据,但是官网提示数据量大时内存消耗会很大,查询会很慢 二种(随机生成个id) select * from t_user_grade as t1 JOIN (select ROUND(RAND()*(select MAX(id) ...
  • MySQL用GROUP BY分组最新一条数据

    千次阅读 2020-08-26 14:29:01
    因为group by后的一条数据默认是按主键id排序后的第一条, 而且mysql查询语句是先执行group by再执行order by的。 所以无法直接 group by 后 创建时间最新的数据。 本来以为这样写可以先按create_time 倒序,再...
  • 有一张这样的数据表, 需求是根据error_type分组然后status最小的第一条数据 第一种写法: select t.* from ( select e.* from error_record e where e.status > 0 and e.error_type > 0 order ...
  • oracle mssql mysql db2 前几条数据

    千次阅读 2014-07-18 15:56:23
    oracle mssql mysql db2 前几条数据
  • mysql中,如何到表里的time字段每过分钟就去一条值,比如说11:50 取一条,然后再取一条11:52的数据,11:54,56,58这样的值???
  • oracle mssql mysql db2 前几条数据 如在ms sqlserver 用此语句:  select top 2 * from test01 就会只显示前2记录,    MYSQL select * from your_table where .... limit ...
  • mysql 获取最新一条数据

    万次阅读 2018-08-31 10:34:09
    SELECT * FROM exam ORDER BY pre_date DESC LIMIT 1 表exam ,字段pre_date 表示时间,LIMIT 关键字取第一条数据
  • 最近遇到个统计报表的需求,数据按照某个字段分组后,其他列最新一条数据的列。 数据库:mysql 在使用传统的查询后,发现order by 是无效的。相信各位童鞋也是一样的情况。 select id,gate_id,sum(vehicle_num) ...
  • 通常情况下我们需要按照某个条件分组后取出最大或者最小的一(N)条数据,然而mysql默认会取出分组之前的某条数据第一次出现的位置,并不会取出最大或者最小的,例如test表中数据如下 id | name value ---|-----...
  • mysql选择指定范围行的记录 limit param1, param2 param1 : 开始搜索的指针 .... param2 : 搜索的数。 ...第一条记录: SELECT * FROM jforum_users limit 0,1搜索;第二记录: SELECT * FROM
  • 下边给出四种方法,由慢到快,方法四最效率。 测试背景: 数据总量41万+ ...这种方法如果limit5的话将会是连续的五,所以这里是limit1,为了实现目的可以执行5次,执行速度214.54s SELEC...
  • 最近在项目中遇到了个问题就是营业员提成,但是营业员提成方式中有几个提成方式比较复杂就是按照子节点访问当前子节点的提成比率,如果当前节点的提成比率没有设置那么就访问上级节点的提成比率,直到访问到根...
  • 比如每个班级成绩第一的学生等等 oracle 和 sqlserver支持函数,mysql不行 这里给一个粗暴的方法: 两个行数 GROUP_CONCAT(A ORDER BY B)和substring_index 思路: 1、GROUP_CONCAT(fA ORDER BY B) 按照...
  • select count(*) as lot from OA_sample_check where left(ecnNO, LOCATE(',',ecnNO)-1)='a1' Mysql 字段值逗号第一数据
  • MySQL分组排序取第一数据的方法

    千次阅读 2019-02-25 23:23:14
    需求分析:多行数据分组排序之后,如何获取第一数据?具体案例如下: 根据要求查询结果: 查询结果username不能重复; username重复的选择条件是status为1则选择该,多个1则按照createtime选取最近的一; ...
  • mysql 先排序分组 组里面最新一条数据

    万次阅读 热门讨论 2018-08-20 11:38:09
     一般写sql 先排序在分组最新的一条数据 不外乎  SELECT p.* FROM (SELECT * FROM sys_message ORDER BY id DESC )p GROUP BY p.messageType ORDER BY id desc  但是这样 还是得不到 分组里面最新的一条...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 157,621
精华内容 63,048
关键字:

mysql取第一条数据

mysql 订阅