使用Laravel(或不使用)合并mysql表中的记录?

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)

who*_*boy 0

我最终编写了一个存储过程来执行此操作。我不会回答这个问题,所以如果有人知道如何在没有存储过程的情况下做到这一点,我会将他们的答案标记为正确。

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)