您的位置:首页 > 数据库 > MySQL

逗号分隔存储 && mysql字符串函数初探

2016-01-25 01:22 465 查看
现在要做一个什么东西呢。n个人助力买东西之后可以参与摇一摇(p.s.除了幸运儿),摇一摇之前得支付。小弟的拙见是,依靠两个字段,一个存储有摇一摇资格ID(买过商品)shakeid,另一个是可以摇一摇的ID(已经支付了摇一摇)shaked,都是字符串类型。

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);

写的比较粗糙,技术比较烂。多多交流。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: