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

现在要做一个什么东西呢。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);

写的比较粗糙,技术比较烂。多多交流。
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值