mysql 使用id in(‘1,2,3’) 的时候,只能查到id=1的数据的解决方法

前提:
t_user表有三条数据,id分别是1、2、3

场景1
查询:select * from t_user where id in(1,2,3)
结果:三条数据
正常

场景2
查询:select * from t_user where id in(‘1,2,3’)
结果:只有id=1的数据

为什么场景2只有1条结果返回?
为什么场景2入参是字符串的’1,2,3’只返回了1条数据,因为:
mysql 中执行 in函数的时候,会将入参字符串‘1,2’通过 CAST(‘1,2,3’ AS SIGNED) 方法优化,最终取第一个参数1,所以执行后的结果就是只有id=1的数据。

解决场景2问题
如何当入参是字符串‘1,2,3’的时候,还能查出三条数据呢
解决:用FIND_IN_SET方法,第一个参数放字段名,第二个参数放字符串的多个id
select * from t_user where FIND_IN_SET(id, ‘1,2,3’)

原因分析:

MySQL中in里面如果是字符串的话,会自动使用类似CAST(‘5,6,7’ AS INT)方法转化成int类型,对于数字开头的字符串来说,转为数字的结果就是截取前面的数字部分(本例中第一个逗号前的数据),对于开头部分不能截取出数字的字符串来说,转换的结果自然就是0了

[求证&散分] MySQL where id in (1,2,3,4,...) 的效率问题讨论 庆祝本月大版得分过万,兼把在这段论坛 经常被问到的一个问题拿出来大家讨论一下。 命题假设: 测试表如下 create table t_06 ... 原文地址:https://www.cnblogs.com/twyth/p/7263369.html 一个 MySQL 存储过程传参数的问题想实现例如筛选 条件 为:where id in(1,2,3,...),下面有个不错的示例,感兴趣的朋友可以参考下 正常写法: select * from table_name t where t.field1 in (1,2,3,4,...); 当在写存... 建表 TEST1CREATE TABLE `TEST1` (` ID ` int(11) NOT NULL,`I ID ` varchar(200) DEFAULT NULL,PRIMARY KEY (` ID `)) ENGINE=InnoDB DEFAULT CHARSET=utf8;结果:建表TEST2CREATE TABLE `TEST2` (` ID ` int(11) NOT NULL,`name` ... 我有一个表(命名单位),结构如下: id type type_ id name parent h id e====================================================12 child 2 no1-r 36 032 child 2 ... 情景描述:要求是查找指定班级 对应 的课程。表的结构是,班级表class 的一个字段course_ id s用于存储course表的 id 。 我的思路很简单,select查找course表,然后使用in嵌套一个子 查询 查询 出所有的 id 。 所以第一次的代码是这样的: SELECT course cou WHERE cou. id IN ( SELECT c.course_ id s class c WHERE c.product_ id = '1' 结果确实只查 在 mysql 的in 查询 会出现结果顺序错乱的情况,select id from table where in (1,2,3)结果返回3,2,1。完美解决方法就是加入order by filed,有时候我们需要 查询 出来的 数据 顺序要跟传入的 条件 顺序一样,这样可以提高可读性。 昨天一朋友说在 MYSQL 存储过程里怎么输入参数如:select * from table_name t where t.field1 in (1,2,3,4,...);网上找了老半天,参数还是不会传进去。后来想到ORACLE 里面可以拼 SQL 然后将拼完的 SQL 再进行执行今天终于搞定了实现这种效果还是选贴段代码吧DROP PROCEDURE IF EXISTS photography.Proc_Te... 我们都知道,各种主流的社交应用或者阅读应用,基本都有列表类视图,并且都有滑到底部加载更多这一功能, 对应 后端就是分页拉取 数据 。好处不言而喻,一般来说,这些 数据 项都是按时间倒序排列的,用户只关心最新的动态,而不关心几个月甚至几年前消息,所以后端返回给客户端的 数据 是不会一次性传递全部内容的(不仅耗费流量,而且还给服务器带来巨大压力)。举个例就说 MySQL ,它已经给我们提供了相应的语句来支持这一功能,那... 建表 TEST1 CREATE TABLE `TEST1` (` ID ` int(11) NOT NULL,`I ID ` varchar(200) DEFAULT NULL,PRIMARY KEY (` ID `)) ENGINE=InnoDB DEFAULT CHARSET=utf8; 建表TEST2 CREATE TABLE `TEST2` (` ID ` int(11) NOT... 若状态为0,1,2,3的字段在 查询 时需要状态为1的排到最前面,0在1后但2,3不动的,若直接用order by的话达不到效果 达不到效果是因为: 若按desc,那么会出现3,2,1,0->这种情况下违反了2,3不动的原则 若按asc,那么会出现0,1,2,3->这种情况违反了0在1之后的原则 解决办法: 1.改变 数据库 改状态字段的定义 2.使用一个用于排序的虚拟属性,如下面的tmp SELECT deploy_state, (CASE deploy_state WHEN 0 THEN 3 WHE