精华内容
下载资源
问答
  • 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 * 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 是

    select * from table_name where column_name=#{xxx} order by column_name limit 1 ;
    select * from table_name where column_name=#{xxx} order by column_name limit 0,1;

    limit 1 与 limit 0,1 是一样的!
    换句话说,

    比如 limit 3,是从查出来的结果中取 前3条数据;
    而limit 0,3 是取
    第0,
    第1,
    第2条 数据,
    也是三条数据

    所以 LIMIT n 等价于 LIMIT 0,n

    展开全文
  • sql 取第一条数据

    千次阅读 2016-08-11 10:15:50
    对于拥有数千记录的大型表来说,TOP 子句是非常有用的。 注释:并非所有的数据库系统都支持 TOP 子句。 SQL Server 的语法: SELECT TOP number|percent column_name(s) FROM table_name MySQL 和 Oracle...
    SQL TOP 子句
    

    TOP 子句用于规定要返回的记录的数目。
    对于拥有数千条记录的大型表来说,TOP 子句是非常有用的。
    注释:并非所有的数据库系统都支持 TOP 子句。

    SQL Server 的语法:
    SELECT TOP number|percent column_name(s)
    FROM table_name

    MySQL 和 Oracle 中的 SQL SELECT TOP 是等价的
    MySQL 语法
    SELECT column_name(s)
    FROM table_name
    LIMIT number
    例子:
    SELECT *
    FROM Persons
    LIMIT 5

    Oracle 语法
    SELECT column_name(s)
    FROM table_name
    WHERE ROWNUM <= number
    例子:
    SELECT *
    FROM Persons
    WHERE ROWNUM <= 5

    原始的表 (用在例子中的):
    Persons 表:
    Id LastName FirstName Address City 
    1 Adams John Oxford Street London 
    2 Bush George Fifth Avenue New York 
    3 Carter Thomas Changan Street Beijing 
    4 Obama Barack Pennsylvania Avenue Washington 

    SQL TOP 实例
    现在,我们希望从上面的 "Persons" 表中选取头两条记录。
    我们可以使用下面的 SELECT 语句:
    SELECT TOP 2 * FROM Persons结果:
    Id LastName FirstName Address City 
    1 Adams John Oxford Street London 
    2 Bush George Fifth Avenue New York 

    SQL TOP PERCENT 实例
    现在,我们希望从上面的 "Persons" 表中选取 50% 的记录。
    我们可以使用下面的 SELECT 语句:
    SELECT TOP 50 PERCENT * FROM Persons结果:
    Id LastName FirstName Address City 
    1 Adams John Oxford Street London 
    2 Bush George Fifth Avenue New York
    展开全文
  • limit的用法 ...那怎么取第二条数据呢。 +----+--------+ | Id | Salary | +----+--------+ | 1 | 100 | | 2 | 200 | | 3 | 300 |   来看怎么排名第二数据 方法1,先取得最大的,然后not in...

    limit的用法

    我们知道在Mysql里面取最大的数据可以用order by 然后limit 1 取得。那怎么取第二条数据呢。

    +----+--------+
    | Id | Salary |
    +----+--------+
    | 1  | 100    |
    | 2  | 200    |
    | 3  | 300    |

     

    来看怎么取排名第二的数据

    方法1,先取得最大的,然后not in 最大的那个,在剩下的取最大的就是第二个。

    select Max(Salary ) from Employee where Salary not in (select Max(Salary ) from Employee )

     

    方法2,使用limit

    select Salary from Employee order by Salary limit 1,1

     

    方法3,使用limit 和 offset

     

    select Salary from Employee order by limit 1 offset 1

     

    拓展:

    Mysql中 limit 和 offset的使用

    Limit子句可以被用于强制 SELECT 语句返回指定的记录数。Limit接受一个或两个数字参数。参数必须是一个整数常量。如果给定两个参数,第一个参数指定第一个返回记录行的位置,第二个参数指定返回从那个记录开始往后的数量。

     

    //初始记录行的偏移量是 0(而不是 1):

      mysql> SELECT * FROM table LIMIT 5,10; //检索记录行6-15

      //为了检索从某一个偏移量到记录集的结束所有的记录行,可以指定第二个参数为 -1:

      mysql> SELECT * FROM table LIMIT 95,-1; // 检索记录行 96-last

      //如果只给定一个参数,它表示返回最大的记录行数目。换句话说,LIMIT n 等价于 LIMIT 0,n:

      mysql> SELECT * FROM table LIMIT 5;     //检索前 5 个记录行

     

    offset

    偏移量的意思

    limit X offset Y

    的意思就是,从第Y条开始,选取X条。

    limit 1 offset 1(从第2条开始,选一条,所以就是排名第二的那条

    limit X,Y

    的意思是,从第X条开始,选取Y条

    参考文档:https://www.cnblogs.com/acm-bingzi/p/msqlLimit.html

    展开全文
  • sql 排序 ROW_NUMBER() OVER 函数这是我之前写的sql排序函数,现在的需求是mysql 分组,组内排序并且取第一条数据。 mysql用子查询实现类似于row_number()函数的功能 场景: versionId=0时,是默认版本,即该条记录...
  • php limit m,n 用法 只多少条数据

    万次阅读 2017-08-16 10:39:54
    其中m是指记录开始的index,从0开始,表示第一条记录 n是指从m+1条开始,n条。 select * from tablename limit 2,4 select * from table limit m,n 其中m是指记录开始的index,从0开始,表示第一条记录 n是指从...
  • 一. 需求 ...当group by 支付订单表后, 默认取第一条数据, 而不是最近一条 三. 解决 select t1.* from (select * from payment_order order by create_time desc limit 10000000000) t1 group...
  • // 查第一条 select top 1 * from user order by id desc; // 查最后一条 方法:使用 limit select * from user limit 1; // 查第一条 select * from user order by id asc limit 1; /...
  • 有一张这样的数据表, 需求是根据error_type分组然后status最小的第一条数据 一种写法: select t.* from ( select e.* from error_record e where e.status > 0 and e.error_type > 0 order ...
  • 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
  • 今天运营同事有个需求要求获取一段时间内每个用户的首投、复投,首投好算,直接groupby就是第一条投资,可获取复投的时候被整蒙圈了,掉到group by的坑里了,特写个笔记祭奠下此坑。。。 获取每个用户复投的sql...
  • 1、hive的分组和组内排序---语法 语法: row_number() over (partition by 字段a order by 计算项b desc ) rank rank是排序的别名 partition by:类似hive的建表,分区的意思; ...2...
  • ORDER BY rand()语句,这个语句可以实现任意条数据,但是官网提示数据量大时内存消耗会很大,查询会很慢 第二种(随机生成个id) select * from t_user_grade as t1 JOIN (select ROUND(RAND()*(select MAX(id) ...
  • 前言: group by函数后到的是分组中的第一条数据,但是我们有时候需要取出各分组的最新一条,该怎么实现呢? 本文提供两种实现方式。 一、准备数据 ... 、三种实现方式 1)先order by之后再分组: ...
  • mysql 随机取一条数据

    千次阅读 2018-05-19 15:06:57
    种办法:select * ... //此处的1就是取出数据第二种办法SELECT * FROM user WHERE userId &gt;= ((SELECT MAX(userId) FROM user )-(SELECT MIN(userId) FROM user )) * RAND() + (SELECT MIN(us...
  • 如何SQL结果集的第一条记录

    万次阅读 2018-12-25 16:46:14
    在SQL Server数据库中,使用top关键字:  SELECT TOP number|percent column_name(s) FROM table_... 在MySQL数据库中,使用LIMIT关键字:  SELECT column_name(s) FROM table_name LIMIT number  例子:SELECT *...
  • 第一个:最简便性能最差的:
  • 最近遇到一个统计报表的需求,数据按照某个字段分组后,其他列最新一条数据的列。 数据库:mysql 在使用传统的查询后,发现order by 是无效的。相信各位童鞋也是一样的情况。 select id,gate_id,sum(vehicle_num) ...
  • oracle mssql mysql db2 前几条数据 如在ms sqlserver 用此语句:  select top 2 * from test01 就会只显示前2条记录,    MYSQL select * from your_table where .... limit ...
  • 个表中的某列的多行数据拼接成种方法 SELECT person_id AS job_no, string_agg(person_name,',') as str_person_name FROM public.tb_attendance_model WHERE create_time >= '2019-06-17 00:...
  • SQL 查询表的第一条数据 和 最后一条数据
  • mybatis的分组排序前几条数据

    千次阅读 2019-03-18 16:08:27
    分组使用:GROUP BY 单个:GROUP BY 列名 多个:GROUP BY 列名1,列名2 ...limit 0,3,从第一条取,取三条 Limit 1,3 从第2条开始取,取3条 补充:使用limit时需要注意偏移量问题,当数据很多且分页到后...
  • 1、最近的一条数据 data = GroundData.objects.last() # 得到最新的数据 得到的是单条数据 2、如果使用切片获取的几条数据,得到的是集合,需要使用for循环进行遍历取出 new_data=Book_detail.objects.filter...
  • 前言: group by函数后到的是分组中的第一条数据,但是我们有时候需要取出各分组的最新一条,该怎么实现呢? 本文提供两种实现方式。 一、准备数据 ...sub=FD4C1C7823CA440DB360FEA3B4A905CD ...
  • 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  但是这样 还是得不到 分组里面最新的一条...
  • 通常情况下我们需要按照某个条件分组后取出最大或者最小的(N)条数据,然而mysql默认会取出分组之前的某条数据第一次出现的位置,并不会取出最大或者最小的,例如test表中数据如下 id | name value ---|-----...
  • 方法: 使用TOP SELECTTOP1*FROMuser; SELECTTOP1*FROMuserorderbyiddesc; 方法: 使用LIMIT SELECT*FROMuserLIMIT1; SELECT*FROMuserORDERBYidASCLIMIT1; S...
  • mysql选择指定范围行的记录 limit param1, param2 param1 : 开始搜索的指针 .... param2 : 搜索的条数。 ...第一条记录: SELECT * FROM jforum_users limit 0,1搜索;第二条记录: SELECT * FROM

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 172,379
精华内容 68,951
关键字:

limit取第二条数据取一条