逗号分隔存储 && mysql字符串函数初探
2016-01-25 01:22
465 查看
现在要做一个什么东西呢。n个人助力买东西之后可以参与摇一摇(p.s.除了幸运儿),摇一摇之前得支付。小弟的拙见是,依靠两个字段,一个存储有摇一摇资格ID(买过商品)shakeid,另一个是可以摇一摇的ID(已经支付了摇一摇)shaked,都是字符串类型。
shake表如下:
首先是有资格摇一摇的,在所有人确定买完商品之后就可以摇一摇了。so,把所有ID通过分隔符存储到shakeid中。
先去`shop`商品表里面提取出来ID,然后存放到`shake`表的`shakeid`中。循环吗?NO!
在concat和concat_ws()区别及MySQL的几个实用字符串函数发现有group_concat函数,先来试一试这函数好用么?用ID=37商品为例子:
select GROUP_CONCAT(uid) from `shop` where shopid=37;
![](http://img.blog.csdn.net/20160125012807627?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
可以看到结果是: 30,7,7,7,7,7,7 代表ID=30买了一次,ID=7买了6次。下面会去亢余
赞啊(默认逗号分隔),又看到distinct参数可以去亢余,加上试一试:
select GROUP_CONCAT(distinct
uid) from `shop` where shopid=37;
![](http://img.blog.csdn.net/20160125012919060?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
可以看到结果已经是: 30,7
赞到爆阿。现在就可以用这个函数了。
INSERT INTO `shake` ( sid, shakeid )
VALUES ( 37, (
SELECT GROUP_CONCAT( DISTINCT uid )
FROM `shop`
WHERE shopid =37 )
);
![](http://img.blog.csdn.net/20160125013251571?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
shakeid存储完成,那么shaked同理,只是在用户支付过摇一摇之后才写进来。我用的是concat_ws函数。
update `shake` set shaked=concat_ws(',',shaked,' ".$uid."') where sid=".$id;每次支付过后把$uid添加到shakeid后面(依旧用逗号分隔),sid=$id代表是同一件商品下的摇一摇资格。
至此,存储完成。那么删除呢。当用户参与过摇一摇之后就不会有资格参与了。从shakeid和shaked里面删除掉用户ID就好了。
replace(shakeid,',6',''),(把shakeid字符串里面的',6')这么替换掉,可行吗?不可以,如果shakeid里面值为:30,6,7,65 的情况下,通过replace(shakeid,',6','')产生的结果就会是30,75 ,而我们的预期是30,7,65,是因为这样把ID=65用户影响到了,且出现新的ID=75的错误ID。而且,这种情况6,3,15下也不会达到预期的删除第一个ID=6的效果。因为我们匹配的是',6'(逗号和6)。
该如何呢?以上面的字符串为基础我们构造一个这样的字符串 ,[30],[6],[7],[65]
然后通过replace(shakeid,',[6]','')替换掉,[6]这个子串就好。
那我们就得更改上面通过GROUP_CONCAT获得的结果了,放弃逗号分隔,用,[x]来分隔。
目的:要将现有的30,7改为,[30],[7]
![](http://img.blog.csdn.net/20160125013251571?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
replace(shakeid,',','],[') 把现有的逗号替换为],[ 的结果就是30],[7
concat(',[' , replace(shakeid,',','],[') ,']' ) 给前面加上,[后面加上]结果就成了 ,[30],[7],达到效果了,先来测试一下:
SELECT CONCAT( ',[', REPLACE( shakeid, ',', '],[' ) , ']' ) FROM `shake` WHERE sid =37
![](http://img.blog.csdn.net/20160125013512234?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
简直是棒棒哒!
这就完了吗?NO。刚才第一步的和这步应该写到一块就不需要两条语句了。
INSERT INTO `shake`(sid,shakeid) values(37, (select group_concat(distinct uid)
from `shop` where shopid=37));
SELECT CONCAT( ',[', REPLACE( shakeid, ',', '],[' ) , ']' ) FROM `shake` WHERE sid =37;
联合到一起就是:
INSERT INTO `shake` ( sid, shakeid )
VALUES ( 37, CONCAT( ',[', REPLACE( (
SELECT GROUP_CONCAT( DISTINCT uid )
FROM `shop`
WHERE shopid =37 ) , ',', '],[' ) , ']' )
)
迫不及待要看一下结果了:
魔法,变!
![](http://img.blog.csdn.net/20160125013712233?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
shakeid构造好了,shaked呢,更简单,稍微修改一下第一步最后的那段:update `shake` set shaked=concat_ws(',',shaked,'[ ".$uid."]') where sid=".$id;不再赘述了。
假定现在的值是:,[30],[6],[7],[65]
![](http://img.blog.csdn.net/20160125014031253?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
存储有了,删除有了,用的时候咋办呢。要提取出来ID值的啊。用正则咯。
$a=array();
preg_match_all('/[0-9]+/',$row['shakeid'],$a);//this is my wrote first regular expression
print_r($a);
写的比较粗糙,技术比较烂。多多交流。
shake表如下:
1.存储
如何存储呢,把ID通过逗号','分隔存储到两个字段中。首先是有资格摇一摇的,在所有人确定买完商品之后就可以摇一摇了。so,把所有ID通过分隔符存储到shakeid中。
先去`shop`商品表里面提取出来ID,然后存放到`shake`表的`shakeid`中。循环吗?NO!
在concat和concat_ws()区别及MySQL的几个实用字符串函数发现有group_concat函数,先来试一试这函数好用么?用ID=37商品为例子:
select GROUP_CONCAT(uid) from `shop` where shopid=37;
可以看到结果是: 30,7,7,7,7,7,7 代表ID=30买了一次,ID=7买了6次。下面会去亢余
赞啊(默认逗号分隔),又看到distinct参数可以去亢余,加上试一试:
select GROUP_CONCAT(distinct
uid) from `shop` where shopid=37;
可以看到结果已经是: 30,7
赞到爆阿。现在就可以用这个函数了。
INSERT INTO `shake` ( sid, shakeid )
VALUES ( 37, (
SELECT GROUP_CONCAT( DISTINCT uid )
FROM `shop`
WHERE shopid =37 )
);
shakeid存储完成,那么shaked同理,只是在用户支付过摇一摇之后才写进来。我用的是concat_ws函数。
update `shake` set shaked=concat_ws(',',shaked,' ".$uid."') where sid=".$id;每次支付过后把$uid添加到shakeid后面(依旧用逗号分隔),sid=$id代表是同一件商品下的摇一摇资格。
至此,存储完成。那么删除呢。当用户参与过摇一摇之后就不会有资格参与了。从shakeid和shaked里面删除掉用户ID就好了。
2.欲删除
怎么删除以逗号分隔的ID呢。以ID=6的用户为例:通过replace函数replace(shakeid,',6',''),(把shakeid字符串里面的',6')这么替换掉,可行吗?不可以,如果shakeid里面值为:30,6,7,65 的情况下,通过replace(shakeid,',6','')产生的结果就会是30,75 ,而我们的预期是30,7,65,是因为这样把ID=65用户影响到了,且出现新的ID=75的错误ID。而且,这种情况6,3,15下也不会达到预期的删除第一个ID=6的效果。因为我们匹配的是',6'(逗号和6)。
该如何呢?以上面的字符串为基础我们构造一个这样的字符串 ,[30],[6],[7],[65]
然后通过replace(shakeid,',[6]','')替换掉,[6]这个子串就好。
那我们就得更改上面通过GROUP_CONCAT获得的结果了,放弃逗号分隔,用,[x]来分隔。
3.存储格式从,更改为,[x]
继续用第一步中得到的37号商品为例:目的:要将现有的30,7改为,[30],[7]
replace(shakeid,',','],[') 把现有的逗号替换为],[ 的结果就是30],[7
concat(',[' , replace(shakeid,',','],[') ,']' ) 给前面加上,[后面加上]结果就成了 ,[30],[7],达到效果了,先来测试一下:
SELECT CONCAT( ',[', REPLACE( shakeid, ',', '],[' ) , ']' ) FROM `shake` WHERE sid =37
简直是棒棒哒!
这就完了吗?NO。刚才第一步的和这步应该写到一块就不需要两条语句了。
INSERT INTO `shake`(sid,shakeid) values(37, (select group_concat(distinct uid)
from `shop` where shopid=37));
SELECT CONCAT( ',[', REPLACE( shakeid, ',', '],[' ) , ']' ) FROM `shake` WHERE sid =37;
联合到一起就是:
INSERT INTO `shake` ( sid, shakeid )
VALUES ( 37, CONCAT( ',[', REPLACE( (
SELECT GROUP_CONCAT( DISTINCT uid )
FROM `shop`
WHERE shopid =37 ) , ',', '],[' ) , ']' )
)
迫不及待要看一下结果了:
魔法,变!
shakeid构造好了,shaked呢,更简单,稍微修改一下第一步最后的那段:update `shake` set shaked=concat_ws(',',shaked,'[ ".$uid."]') where sid=".$id;不再赘述了。
4.删除
接下来,删除就达到简单了,更新一下就好。UPDATE `shake` SET shakeid = REPLACE( shakeid, ',[6]', '' ) WHERE sid =37假定现在的值是:,[30],[6],[7],[65]
5.对了
对了什么?什么对了?你在说什么?存储有了,删除有了,用的时候咋办呢。要提取出来ID值的啊。用正则咯。
$a=array();
preg_match_all('/[0-9]+/',$row['shakeid'],$a);//this is my wrote first regular expression
print_r($a);
写的比较粗糙,技术比较烂。多多交流。
相关文章推荐
- MySql效率问题
- Cobar使用文档(可用作MySQL大型集群解决方案)
- dbutils + mysql事务
- mysql字符串分割
- MySQL实现统计数据并插入数据的存储过程
- mysql基础知识
- mysql加强
- mysql处理高并发,防止库存超卖
- MySql免安装版的配置
- MySQL常用命令
- Mysql 读写分离实现及代理Amoeba的使用
- (转)mysql数据类型
- mysql和mysqli使用笔记
- red hat 7.2下mysql中文乱码问题
- MySQL的启动
- MySQL的启动
- MySQL下载及安装
- MySQL下载及安装
- mysql批量插入
- mysql图形化界面MySQL_Workbench