有个小说表里面有个type字段,它存款和储蓄的是小说类型,有
1头条、2推荐介绍、3火爆、4图文等等 。
方今有篇小说他既是头条,又是火热,照旧图像和文字,type中以
1,3,4
的格式存款和储蓄。那大家什么用sql查找全体type中有4的图像和文字类型的篇章吧?? 
那将在大家的 find_in_set
出马的时候到了。以下为援用的源委:

SELECT * FROM 表1 WHERE
convert(varchar(10),表1.创立时间,120)=CONVERT(VARCHALX570(10),GETDATE(),120)

会话1

会话2

SET autocommit=0;

SELECT * FROM  city WHERE city_id=14;

city_id      country_id        cityname CityCode

14     2       22     001

SET autocommit=0;

SELECT * FROM  city WHERE city_id=14;

city_id      country_id        cityname CityCode

14     2       22     001

— 对 city_id=14加for update 排它锁

SELECT cityname FROM  city WHERE city_id=14 FOR UPDATE ;

cityname

11

 

 

— 可以查询

SELECT cityname FROM  city WHERE city_id=14

cityname

11

— 但不能对 city_id=14加for update 排它锁

SELECT cityname FROM  city WHERE city_id=14 FOR UPDATE ;

等待中…

— 更新后,释放锁

UPDATE city  SET cityname=’深圳’ WHERE city_id =14;

COMMIT;

 

 

获取锁 for update共享锁,值还是11

cityname

11

后天无意之中看到了该函数,感到挺有用的一个函数,这里记录一下。

前几天遇见了三个主题素材,要询问前些天加多到二个表中的数据,后来消除了,嗯,记录一下:

1 .innodb 共享锁(lock in share mode)演示

MySQL手册中find_in_set函数的语法:

FIND_IN_SET(str,strlist)

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

倘若字符串str在由N个子链组成的字符串列表strlist 中,则重临值的范围在 1
到 N 之间。 四个字符串列表正是七个由一些被 ‘,’
符号分开的子链组成的字符串。若是第1个参数是贰个常数字符串,而第一个是type
SET列,则FIND_IN_SET() 函数被优化,使用比特计算。 假若str不在strlist
或strlist 为空字符串,则再次回到值为 0 。如自由贰个参数为NULL,则重返值为
NULL。那么些函数在首先个参数包含叁个逗号(‘,’)时将不可能符合规律运作。


 例子:
mysql> SELECT FIND_IN_SET(‘b’, ‘a,b,c,d’); 
-> 2 因为b 在strlist群集中放在2的地点 从1从头

select FIND_IN_SET(‘1’, ‘1’); 重回 就是1 那时的strlist集结有一些卓殊唯有三个字符串 其实正是讲求前二个字符串
要求求在后多少个字符串集结中才再次来到大于0的数 
select FIND_IN_SET(‘2’, ‘1,2’); 返回2 
select FIND_IN_SET(‘6’, ‘1’); 返回0


注意: 
select * from treenodes where FIND_IN_SET(id, ‘1,2,3,4,5’); 
使用find_in_set函数三遍回到多条记录 
id 是三个表的字段,然后每条记下分别是id等于1,2,3,4,5的时候 
稍稍类似in (集结) 
select * from treenodes where id in (1,2,3,4,5);


为了那些,又查了下日期函数,记录一下:

会话1

会话2

SET autocommit=0;

SELECT cityname FROM  city WHERE city_id=14;

city_id      country_id        cityname CityCode

14     2       22     001

SET autocommit=0;

SELECT cityname FROM  city WHERE city_id=14;

city_id      country_id        cityname CityCode

14     2       22     001

— 对 city_id=14加共享锁

SELECT * FROM  city WHERE city_id=14 LOCK IN SHARE MODE;

city_id      country_id        cityname CityCode

14     2       22     001

 

 

— 也对 city_id=14加共享锁

SELECT * FROM  city WHERE city_id=14 LOCK IN SHARE MODE;

city_id      country_id        cityname CityCode

14     2       22     001

— 当前会话对锁定的记录进行更新操作,等待锁。

UPDATE city  SET cityname=’深圳’ WHERE city_id =14;

 等待中….

 

 

— 会话2也对锁定的记录进行更新操作,则会导致死锁退出

UPDATE city  SET cityname=’深圳’ WHERE city_id =14;

错误代码: 1213

Deadlock found when trying to get lock; try restarting transaction

获得锁后,更新成功

查询:update city set cityname=’深圳’ where city_id =14

共 1 行受到影响

 

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, 'name', 'daodao,xiaohu,xiaoqin');
INSERT INTO `tb_test` VALUES (2, 'name2', 'xiaohu,daodao,xiaoqin');
INSERT INTO `tb_test` VALUES (3, 'name3', 'xiaoqin,daodao,xiaohu');

原本认为mysql能够扩充如此的询问:

SELECT id,name,list from tb_test WHERE 'daodao' IN(list); -- (一) 

澳门微尼斯人手机版 1

骨子里那样是丰富的,那样独有当list字段的值等于’daodao’时(和IN后边的字符串完全相称),查询才有效,不然都得不到结果,纵然’daodao’真的在list中。

再来看看这些:

SELECT id,name,list from tb_test WHERE 'daodao' IN ('libk', 'zyfon', 'daodao'); -- (二)

 

澳门微尼斯人手机版 2

与上述同类是能够的。

这两条到底有何差距吗?为啥第一条不能够赢得准确的结果,而第二条却能获取结果。原因实在是(一)中
(list) list是变量, 而(二)中 (‘libk’, ‘zyfon’, ‘daodao’)是常量。
因此一旦要让(一)能正确工作,须求用find_in_set():

SELECT id,name,list from tb_test WHERE FIND_IN_SET('daodao',list); -- (一)的改进版

澳门微尼斯人手机版 3

总结:
故而要是list是常量,则能够直接用IN, 不然要用find_in_set()函数。


SELECT * FROM 表1 WHERE
convert(varchar(7),表1.创办时间,120)=CONVERT(VARCHA景逸SUV(7),GETDATE(),120)

2.  innodb 排它锁(for update)演示

发表评论

电子邮件地址不会被公开。 必填项已用*标注