解决mysql中limit和in不能同时使用的问题

先给出数据表

CREATE TABLE `test_tb_grade` (
  `ID` int(10) NOT NULL AUTO_INCREMENT,
  `USER_NAME` varchar(20) DEFAULT NULL,
  `COURSE` varchar(20) DEFAULT NULL,
  `SCORE` float DEFAULT ‘0‘,
  PRIMARY KEY (`ID`)
) ENGINE=InnoDB AUTO_INCREMENT=28 DEFAULT CHARSET=utf8

对应的语句

insert  into `test_tb_grade`(`ID`,`USER_NAME`,`COURSE`,`SCORE`) values (19,‘张三‘,‘语文‘,34),(20,‘张三‘,‘数学‘,58),(21,‘张三‘,‘英语‘,58),(22,‘李四‘,‘数学‘,45),(23,‘李四‘,‘语文‘,87),(24,‘李四‘,‘英语‘,45),(25,‘王五‘,‘数学‘,76),(26,‘王五‘,‘语文‘,34),(27,‘王五‘,‘英语‘,89);

有时会我们会写出这样的语句

SELECT * FROM test_tb_grade
WHERE id IN (SELECT id FROM test_tb_grade LIMIT 0,5);

看上去没啥没什么毛病,但是一执行就会出现这样的错

<e>查询:select * from test_tb_grade where id in (SELECT id from test_tb_grade limit 0,5) LIMIT 0, 1000

错误代码: 1235
This version of MySQL doesn‘t yet support ‘LIMIT & IN/ALL/ANY/SOME subquery‘

原因是mysql的这个版本是不支持in里面的语句使用limit

解决方式有两种

第一种,通过使用伪表的方式,进行表连接操作。

SELECT a.*,b.*
FROM test_tb_grade  a
INNER JOIN (SELECT id FROM test_tb_grade  LIMIT 0,5) b
ON a.id = b.id

第二种,将in语句里面的查询再包装一层,绕过去即可。

SELECT * FROM test_tb_grade
WHERE id IN
(SELECT sc.id FROM (SELECT id FROM test_tb_grade LIMIT 0,5)AS sc);

两种方式推荐第一种。避免了in语句。进行explain诊断会发现第一种效率高很多。

记录下sql语句的完整执行顺序

1、from子句组装来自不同数据源的数据;
 2、where子句基于指定的条件对记录行进行筛选; 
3、group by子句将数据划分为多个分组; 
4、使用聚集函数进行计算;
5、使用having子句筛选分组; 
6、计算所有的表达式; 
7、使用order by对结果集进行排序。

原文地址:https://www.cnblogs.com/c-h-y/p/9946813.html

时间: 2024-10-01 18:04:14

解决mysql中limit和in不能同时使用的问题的相关文章

mysql中limit与in不能同时使用的解决方式.

mysql中limit与in不能同时使用的解决方式. 分类: MySQL2011-10-31 13:53 1277人阅读 评论(0) 收藏 举报 mysqlsubquery MySQL5.1中子查询是不能使用LIMIT的,报错: "This version of MySQL doesn't yet support 'LIMIT & IN/ALL/ANY/SOME subquery' " 这样的语句是不能正确执行的.select * from message where id i

MYSQL中LIMIT用法

MYSQL中LIMIT用法 SELECT * FROM tableName LIMIT [offset,] rows; 1.select * from table limit m,n(显示条数) 其中m是指记录开始的索引index(索引是从0开始的表示第一条记录 ) n是指从第m+1条开始,取n条. 结果是检索记录第m+1行至(m+n)行记录,共取出n条记录 ex: SELECT * FROM 表名 limit 6,5; 结果:检索记录第7行至11行记录,共取出5条记录. 2.n可以被设置为-1

sqlserver row_number 类似 mysql中 limit 用法

select * from ( select row_number() over(ORDER BY inspecdate desc,inspectime DESC,itemorder asc ) as num, contentid,quesioncontext,tempid,tempname,itemid,itemtext,belongteam,teamname,inspecdate, inspectime,contenttext,createperson,newaddtime,updateti

Mysql中limit的用法详解

对比Oracle.SQL Server,个人感觉MySql的分页是最好用的,现在总结一下,写在这里. Mysql中limit的用法: 在我们使用查询语句的时候,经常要返回前几条或者中间某几行数据,这个时候怎么办呢?不用担心,mysql已经为我们提供了这样一个功能. SELECT * FROM table LIMIT [offset,] rows | rows OFFSET offset LIMIT 子句可以被用于强制 SELECT 语句返回指定的记录数. LIMIT 接受一个或两个数字参数.参数

MySQL中limit使用动态参数的解决方法(拼接SQL字符串语句来执行SQL)

官方好像说过limit已经在5.6版本上支持了动态参数,但是测试时依然还是不行. 那么要解决limit动态参数唯一能做的就是使用字符串SQL拼接的形式,然后再进行执行. 一般有以下方式解决: 1.存储过程拼接 2.函数拼接 3.视图里拼接 4.当前查询的session中使用 其实上面都是同一个意思,就是使用一个变量存取这个SQL,然后再执行这个变量. 样例: set @stmt = concat('select * from ',table_name,' limit ?,?'); prepare

MYSQL 中 LIMIT 用法

mapper文件中的sql: -------------------------------------------------------------------------------------------- (在实体类中定义的属性) start:从第几条记录开始. size:读取几条记录. select id="findAllUsers" parameterType="Map" resultType="entity.IUser">

如何解决Mysql中忘记root密码的情况

方法一: MySQL提供跳过访问控制的命令行参数,通过在命令行以此命令启动MySQL服务器: safe_mysqld --skip-grant-tables& 即可跳过MySQL的访问控制,任何人都可以在控制台以管理员的身份进入MySQL数据库. 需要注意的是在修改完密码以后要把MySQL服务器停掉重新启动才会生效 方法二: 可以进行如下的步骤重新设置MySQL的root密码: 1.首先确认服务器出于安全的状态,也就是没有人能够任意地连接MySQL数据库. 因为在重新设置MySQL的root密码

mysql中limit的用法详解[数据分页常用]

在我们使用查询语句的时候,经常要返回前几条或者中间某几行数据,这个时候怎么办呢?不用担心,mysql已经为我们提供了这样一个功能. SELECT * FROM table  LIMIT [offset,] rows | rows OFFSET offset LIMIT 子句可以被用于强制 SELECT 语句返回指定的记录数.LIMIT 接受一个或两个数字参数.参数必须是一个整数常量.如果给定两个参数,第一个参数指定第一个返回记录行的偏移量,第二个参数指定返回记录行的最大数目.初始记录行的偏移量是

解决mysql中无法显示中文的一个实例

1 登录数据库 amp1:~ # mysql -uroot -pmysql.rzrk Welcome to the MySQL monitor.  Commands end with ; or \g. Your MySQL connection id is 2132 Server version: 5.0.95-log SUSE MySQL RPM Type 'help;' or '\h' for help. Type '\c' to clear the current input statem