Mysql函数FIND_IN_SET()的使用方法

Mysql函数FIND_IN_SET()的使用方法

https://www.cnblogs.com/gpfeisoft/p/5535450.html

有了FIND_IN_SET这个函数。我们可以设计一个如:一只手机即是智能机,又是Andriod系统的。

比如:有个产品表里有一个type字段,他存储的是产品(手机)类型,有 1、智能机,2、Andriod系统,3、小米系统,4、1000元以下

现在有条手机的记录即是1000元以下的,又是智能机,还是Andriod的系统。

type中以 4,1,2的格式存储.

那们我们如何用sql查找所有type中有4的1000元以下的手机呢,

这就要我们的find_in_set出马的时候到了.

先看MySQL手册中find_in_set函数的语法:

FIND_IN_SET(str,strlist)

假如字符串str 在由N个子链组成的字符串列表strlist 中,则返回值的范围在 1 到 N 之间。一个字符串列表就是一个由一些被‘,’符号分开的自链组成的字符串。如果第一个参数是一个常数字符串,而第二个是type SET列,则   FIND_IN_SET() 函数被优化,使用比特计算。如果str不在strlist 或strlist 为空字符串,则返回值为 0 。如任意一个参数为NULL,则返回值为 NULL。这个函数在第一个参数包含一个逗号(‘,’)时将无法正常运行。

mysql> SELECT FIND_IN_SET(‘b’,’a,b,c,d’);

+—————————-+

| FIND_IN_SET(‘b’,’a,b,c,d’) |

+—————————-+

|                          2 |

+—————————-+

1 row in set (0.00 sec)

用起来很简单

就以上面我说到的情况来举例:

以下为实际应用当中的SQL语句:

select * from mobile where FIND_IN_SET(‘4’,type);

这个就可以找出所有1000元以下手机的记录!

 

______________________________________________________________________________________________________________

查询表字段 pingid = (1,2,3,)

 

SELECT * FROM `linkinfo` WHERE `pingid` REGEXP ‘{id},’ AND `pingid` NOT REGEXP ‘[[:alnum:]]+{id},’   使用上面的语句,可以查询出来

 

用FIND_IN_SET() 更简单

 

SELECT * FROM linkinfo WHERE FIND_IN_SET( ‘1’, pingid )

 

 

 

原来以为mysql可以进行这样的查询
select id, list, name from table where ‘daodao’ IN (list);      (一)
注:1. table含有三个字段id:int, list:varchar(255), name:varchar(255)

实际上这样是不行的,这样只有当name是list中的第一个元素时,查询才有效,否则都的不到结果,即使’daodao’真的再list中

再来看看这个:
select id, list, name from table where ‘daodao’ IN (‘libk’, ‘zyfon’, ‘daodao’);    (二)
这样是可以的
———————————————————

这两条到底有什么区别呢?为什么第一条不能取得正确的结果,而第二条却能取得结果。

原因其实是(一)中 (list)    list是变量, 而(二)中 (‘libk’, ‘zyfon’, ‘daodao’)是常量

所以如果要让(一)能正确工作,需要用find_in_set():
select id, list, name from table where FIND_IN_SET( ‘daodao’ , list); (一)的改进版。

总结:所以如果list是常量,则可以直接用IN, 否则要用FIND_IN_SET()函数

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/113102.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • CPU流水线技术演进「建议收藏」

    CPU流水线技术演进「建议收藏」一.三级线性流水线每个流水级的结构是:逻辑电路+寄存器我们可以将流水线往下细分,使得各个流水级足够小(CPU执行时间少),就可以通过提高系统时钟频率来提高CPU的处理速度。二.多级线性流水线(这里以5级为例)注意:我们把5级以上的流水线称为超流水线结构。三.muti-多级线性流水线(这里以5级为例)四.多级非线性流水线(乱序执行部件)五.超线程处理器多级非线性流水线(虚拟处理器共用乱序执行部件)拥有超线程的处理器将两个虚拟的处理器暴露给共享的乱..

    2022年8月20日
    4
  • mysql8 安装启动报错[通俗易懂]

    注意点1my.ini配置,其中这两项一定要按这个格式,双引号及双反斜杠,否则初始化时会报下面的错basedir="D:\\tool\\MYSQL\\mysql-8.0.12-winx64"datadir="D:\\tool\\MYSQL\\mysql-8.0.12-winx64\\data"[mysqld]#Removeleading#andsettothe…

    2022年4月15日
    71
  • merging dua II audio interface_power of one

    merging dua II audio interface_power of one题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=6623MinimalPowerofPrimeTimeLimit:2000/1000MS(Java/Others)MemoryLimit:65536/65536K(Java/Others)TotalSubmission(s):1935AcceptedSub…

    2022年9月16日
    0
  • linux dpkg命令

    linux dpkg命令**apt-get(来自:http://wiki.ubuntu.org.cn/Apt-get%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8D%97)apt-getupdate——在修改/etc/apt/sources.list或者/etc/apt/preferences之後运行该命令。此外您需要定期运行这一命令以确保您的软件包列表是最新的。apt

    2022年5月22日
    68
  • Android —facebook/litho框架 超实用的入门干货

    Android —facebook/litho框架 超实用的入门干货可能很多人不知道litho是什么,我这里简单说一下litho就是用代码写布局。嗯,就是那么简单。或许你会问为什么用代码来写呢我xml用的挺好也方便,至于这些问题我都不会回答(坏笑)说了是干货所以肯定以代码为主所以这些介绍我能省就省了。其实网上有很多大神从框架层面介绍了litho的好处和作用,可以解答这些问题。读完之后就知道litho的好处啦。但可惜的是介绍litho用法的文章却是少之又少…

    2025年6月1日
    1
  • 简述Vue的响应式原理

    简述Vue的响应式原理当一个Vue实例创建时,vue会遍历data选项的属性,用Object.defineProperty将它们转为getter/setter并且在内部追踪相关依赖,在属性被访问和修改时通知变化。每个组件实例都有相应的watcher程序实例,它会在组件渲染的过程中把属性记录为依赖,之后当依赖项的setter被调用时,会通知watcher重新计算,从而致使它关联的组件得以更新。 巴拉巴拉:==…

    2022年5月7日
    64

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号