who*_*boy 5 php mysql laravel laravel-5
我正在跟踪用户活动,但未使用cookie_id登录并按日期对这些活动进行分组.当用户登录时,我想将所有记录从他们的cookie_id传输到他们的user_id.如果用户全天使用不同的计算机,则cookie_id和user_id日期可以重叠.
例如,user_id为1的用户从工作中登录,但在家中她没有登录,因此我们为她分配了一个123的cookie_id.
表数据可能如下所示.
id user_id cookie_id date
2 1 NULL 2015-09-07
18 1 NULL 2015-09-10
19 NULL 123 2015-09-10
21 NULL 123 2015-09-11
22 1 NULL 2015-09-11
24 NULL 123 2015-09-12
Run Code Online (Sandbox Code Playgroud)
最后一个星期六,她决定从家里登录她的帐户.
我想要做的是合并所有具有相应user_id /日期记录的记录,并使用cookie_id为123更新行,user_id为1按日期分组,创建所需的任何新记录.我也喜欢相关的香蕉表也适用于更新.
id user_id cookie_id date
2 1 NULL 2015-09-07
18 1 NULL 2015-09-10
22 1 NULL 2015-09-11
24 1 NULL 2015-09-12
Run Code Online (Sandbox Code Playgroud)
我正在使用Laravel并且想要使用查询构建器.我有所有代码,除了数据库查询工作.如果有人认为它有用,我很乐意发布它.
我的表结构如下,我做了一个SQLFiddle.
banana_groups
id int(10),
user_id int(10),
cookie_id varchar(255),
date date NOT NULL,
Run Code Online (Sandbox Code Playgroud)
香蕉
id int(10),
banana_group_id int(10),
monkey_id int(10),
Run Code Online (Sandbox Code Playgroud)
编辑
为了接受SO的精神并回应vho的评论(神秘地消失了),这是我尝试编写这个SQL.不用说,它是不完整的,不起作用.
Select *
FROM banana_groups AS m
WHERE EXISTS
(SELECT 1 FROM banana_groups WHERE m.user_id = 2)
AND NOT EXISTS
(SELECT 1 FROM banana_groups WHERE ...
Run Code Online (Sandbox Code Playgroud)
我最终编写了一个存储过程来执行此操作。我不会回答这个问题,所以如果有人知道如何在没有存储过程的情况下做到这一点,我会将他们的答案标记为正确。
CREATE PROCEDURE `transfer_bananas`(IN _cookieId VARCHAR(255), IN _userId INT)
BEGIN
DECLARE v_id INT;
DECLARE v_user_id INT;
DECLARE v_date DATE;
DECLARE v_done INT DEFAULT 0;
DECLARE cur_banana CURSOR FOR
SELECT id, `date`, (SELECT id from banana_groups
WHERE user_id = _userId AND
`date` = q.date) AS userId FROM banana_groups AS q
WHERE cookie_id = _cookieId;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET v_done = 1;
OPEN cur_banana;
loop_banana: LOOP
FETCH cur_banana INTO v_id,v_date, v_user_id;
IF v_done = 1 THEN
LEAVE loop_banana;
END IF;
IF(v_user_id IS NULL) THEN
UPDATE
banana_groups
SET
user_id = _userId,
cookie_id = NULL
WHERE
id = v_id;
ELSE
UPDATE
bananas
SET
banana_group_id = v_user_id
WHERE
banana_group_id = v_id;
DELETE FROM
banana_groups
WHERE
id = v_id;
END IF;
END LOOP loop_banana;
CLOSE cur_banana;
END
Run Code Online (Sandbox Code Playgroud)
我从 Laravel 调用它
DB::statement(DB::raw('CALL transfer_bananas(\''
. $cookie_id
. '\', '
. $user->id
.');'
));
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
153 次 |
| 最近记录: |