如何编写查询以将两个帐户及其活动日志合并为一个? [关闭]

Posted

技术标签:

【中文标题】如何编写查询以将两个帐户及其活动日志合并为一个? [关闭]【英文标题】:How to Write a Query to Merge Two Accounts and their Activity Logs into One? [closed] 【发布时间】:2008-11-06 21:20:55 【问题描述】:

我们经常有用户创建多个帐户,然后多次存储相同的课程活动数据。一旦他们意识到错误,他们就会与我们联系以将帐户合并为一个他们可以使用的帐户。

我一直在拼命想弄清楚如何在 mysql 中编写一个查询,将他们的活动日志合并到一个配置文件中,这样我就可以删除其他配置文件,但我仍然找不到将起作用的查询。

表格如下所示:

CREATE TABLE user_rtab (
    user_id int PRIMARY KEY,
    username varchar,
    last_name varchar,
    first_name varchar
);

CREATE TABLE lessonstatus_rtab (
    lesson_id int,
    user_id int,
    accessdate timestamp,
    score double,
);

发生的情况是,用户最终在两个或多个帐户下学习相同的课程和不同的课程,然后他们想要学习所有课程状态并将它们分配到一个用户帐户下。

任何人都可以提供一个查询,根据用户表中的姓氏和名字字段来完成此操作,以确定所有用户帐户,然后仅使用用户或用户名字段将所有必要的状态迁移到一个帐户吗?

【问题讨论】:

【参考方案1】:

尝试通过 last/first 合并此数据是一个可怕的想法,您拥有的用户越多,您就越有可能将不正确的条目进行网格化。您的桌子上有 ID 是有原因的,请使用它们。

我看不出您为什么不能说“我想将用户 7 合并到 12”然后执行以下操作的任何原因:

UPDATE lessonstatus_rtab SET user_id=12 WHERE user_id=7;
DELETE FROM user_rtab WHERE user_id=7;

【讨论】:

【参考方案2】:

我目前的一个客户也面临着类似的问题,只是他们有几十个表需要合并。这是使用现实生活中的主键(自然键)的原因之一。最好的办法是在它发生之前尽量避免这个问题。

要记住的另一件事是,两个人可以共享相同的名字和姓氏。也许您不会因为您的用户群而认为这是一个问题,但是如果他们已经创建了多个帐户,那么在他们开始编造假名称或创建几乎相同但不完全相同的名称之前需要多长时间。名字通常不是用来确定两个人是否相同的好东西。

至于您问题的技术部分,很大程度上取决于业务规则是什么。如果他们在那里有两次相同的课程,但分数不同,你会使用最高分吗?您如何决定将所有内容链接到哪个用户帐户?无论如何,这可能是一个多步骤的过程。

【讨论】:

【参考方案3】:

这个怎么样,假设我们将 user_id 2 合并为 1。

这会更新在 2 下完成但尚未在 1 下完成的课程。

UPDATE lessonstatus_rtab
SET user_id = 1
WHERE user_id = 2
AND NOT EXISTS
(SELECT *
 FROM lessonstatus_rtab e
 WHERE e.lesson_id = lessonstatus_rtab.lesson_id
 AND user_id = 1)

任何剩余的都是重复的,现在可以删除:

DELETE FROM lessonstatus_rtab
WHERE user_id = 2

【讨论】:

以上是关于如何编写查询以将两个帐户及其活动日志合并为一个? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

如何为查询中的条件使用变量以将查询限制为活动表单?

如何编写 BigQuery/SQL 查询以将一个表中的列的平均值与第二个/另一个表中的列相除

如何编写 Apollo Server 插件来记录请求及其持续时间

如何编写 MySQL 触发器以将行插入另一个表?

如何合并两个 Firebase 帐户(一个使用电子邮件创建,另一个使用电话号码创建)?

如何提示用户在 VBA 中选择文件位置以将文件合并到一个工作簿中