zoukankan      html  css  js  c++  java
  • mysql find_in_set函数

    MySQL手册中find_in_set函数的语法:

    FIND_IN_SET(str,strlist)

    str 要查询的字符串
    strlist 字段名 参数以”,”分隔 如 (1,2,6,8)
    查询字段(strlist)中包含(str)的结果,返回结果为null或记录

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

    例子:

    SELECT FIND_IN_SET('b', 'a,b,c,d');

     

    select FIND_IN_SET('1', '1'); 返回 就是1 这时候的strlist集合有点特殊 只有一个字符串 其实就是要求前一个字符串 一定要在后一个字符串集合中才返回大于0的数
    select FIND_IN_SET('2', '1,2'); 返回2
    select FIND_IN_SET('6', '1'); 返回0

    find_in_set()和in的区别:

    CREATE TABLE `tb_test` (
      `id` int(8) NOT NULL auto_increment,
      `name` varchar(255) NOT NULL,
      `list` varchar(255) NOT NULL,
      PRIMARY KEY  (`id`)
    );
     
    INSERT INTO `tb_test` VALUES (1, 'aaa', 'aaa,bbb,ccc');
    INSERT INTO `tb_test` VALUES (2, 'bbb', 'bbb,aaa,ccc');
    INSERT INTO `tb_test` VALUES (3, 'ccc', 'ccc');
    SELECT id,name,list from tb_test WHERE 'aaa' IN (list);

      这样只有当list字段的值等于'aaa'时(和IN前面的字符串完全匹配),查询才有效,否则都得不到结果,即使'aaa'真的在list中。

    SELECT id,name,list from tb_test WHERE 'aaa' IN ('aaa', 'bbb', 'ccc');

    之前的sql中 (list) list是变量, 而现在的sql中('aaa', 'bbb', 'ccc')是常量。

    用find_in_set():

    find_in_set()和like的区别:

    在mysql中,有时我们在做数据库查询时,需要得到某字段中包含某个值的记录,但是它也不是用like能解决的,使用like可能查到我们不想要的记录,它比like更精准,这时候mysql的FIND_IN_SET函数就派上用场了,下面来看一个例子。

    CREATE TABLE users(
        id int(6) NOT NULL AUTO_INCREMENT,
        name VARCHAR(20) NOT NULL,
        limits VARCHAR(50) NOT NULL, -- 权限
        PRIMARY KEY (id)
    );
     
    INSERT INTO users(name, limits) VALUES('小张','1,2,12'); 
    INSERT INTO users(name, limits) VALUES('小王','11,22,32');

    其中limits表示用户所拥有的权限(以逗号分隔),现在想查询拥有权限编号为2的用户,如果用like关键字的话,则查询结果如下:

    SELECT * FROM users WHERE limits LIKE '%2%';

     这样第二条数据不具有权限'2'的用户也查出来了,不符合预期。下面利用mysql 函数find_in_set()来解决。

    SELECT * FROM users WHERE FIND_IN_SET(2,limits);

  • 相关阅读:
    51nod 1179 最大的最大公约数 (数论)
    POJ 3685 二分套二分
    POJ 3045 贪心
    LIC
    HDU 1029 Ignatius and the Princess IV
    HDU 1024 Max Sum Plus Plus
    HDU 2389 Rain on your Parade
    HDU 2819 Swap
    HDU 1281 棋盘游戏
    HDU 1083 Courses
  • 原文地址:https://www.cnblogs.com/ooo0/p/14885137.html
Copyright © 2011-2022 走看看