我们经常有用户创建多个帐户,然后最终多次存储相同的课程活动数据。一旦他们意识到错误,他们就会联系我们,将这些帐户合并为一个他们可以使用的帐户。
我一直在拼命地试图弄清楚如何用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,
);
发生的情况是,用户最终在两个或多个帐户下学习相同的课程和不同的课程,然后他们希望获取所有课程状态,并将其分配到一个用户帐户下。
是否有人可以提供一个查询,根据用户表中的姓氏和名字字段来确定所有用户帐户,然后只使用用户或用户名字段将所有必要的状态迁移到一个帐户?
发布于 2008-11-06 21:33:50
我当前的一个客户正面临着类似的问题,除了他们有几十个表必须合并。这是使用现实生活中的主键(自然键)的一个原因。你最好的办法就是在这个问题发生之前尽量避免它。
另一件要记住的事情是,两个人可以共享相同的名字和姓氏。也许你不认为这是一个问题,因为你的用户基础,但如果他们已经创建了多个帐户,多久他们才会开始编造假名或创建几乎相同但不完全相同的名称。通常情况下,通过匹配名字来确定两个人是否相同并不是一件好事。
至于你问题的技术部分,这在很大程度上取决于业务规则是什么。如果他们有两次相同的课程,但分数不同,你会使用最高分吗?您如何决定将所有内容链接到哪个用户帐户?无论如何,这可能是一个多步骤的过程。
发布于 2008-11-06 21:29:10
试图通过最后/第一个合并这些数据是一个可怕的想法,你拥有的用户越多,你就越有可能把不正确的条目网格化。您的表中有ID是有原因的,请使用它们。
我看不出你为什么不能说“我想把用户7合并成12”,然后执行以下操作:
UPDATE lessonstatus_rtab SET user_id=12 WHERE user_id=7;
DELETE FROM user_rtab WHERE user_id=7;
发布于 2008-11-06 21:28:38
假设我们将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
https://stackoverflow.com/questions/270325
复制相似问题