现在要做一个什么东西呢。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);
写的比较粗糙,技术比较烂。多多交流。