Mysql 插入一个不同的列,将对应的其他列从一个表插入到另一个表
我对数据库查询有问题。我有三个表格项目,开发人员和电子邮件。在developers表中,有许多行的名称相同,但电子邮件不同。我必须插入不同的名称,但所有的电子邮件都位于电子邮件表中它们所属的名称行中,即Mysql 插入一个不同的列,将对应的其他列从一个表插入到另一个表,mysql,database,Mysql,Database,我对数据库查询有问题。我有三个表格项目,开发人员和电子邮件。在developers表中,有许多行的名称相同,但电子邮件不同。我必须插入不同的名称,但所有的电子邮件都位于电子邮件表中它们所属的名称行中,即 example ///////////////////////////////////////////// developers table have records:- id_developer project_id name email
example
/////////////////////////////////////////////
developers table have records:-
id_developer project_id name email
0 1 umar umar@gmail.com
1 1 umar umar@developers.com
Now i want to inert the data in email table as:-
user_id name email_ids
0 umar umar@gmail.com
umar@developers.com
////////////////////////////////////////////
projects
----------
id_project
name
----------
developers
----------
id_developer
project_id
name
email
----------
email
----------
user_id
name
email_ids
----------
以下是我当前的查询。请帮帮我。提前谢谢
INSERT INTO email(user_id, dev_name, email_ids)
SELECT p.id_project,
d.name,
d.email
FROM projects p
INNER JOIN developers AS d
ON p.id_project = d.project_id
WHERE d.name IN (SELECT name
FROM developers
GROUP BY name HAVING(COUNT(name) > 1 ))
GROUP BY(d.name)
在评论中进行了一些对话之后,您真正需要的是在这里进行适当的数据建模 以您不希望的方式在数据库中保存数据是一种非常糟糕的做法
user_id name email_ids
0 umar umar@gmail.com
umar@developers.com
将来检索此数据时,您将遇到问题,因为您必须找到一种在需要时检索或拆分此数据的方法
因此,根据您当前的模型,您只需稍微更改一下表格即可满足您的需求。您的模型是这样的:
projects developers email
---------- ------------- ------------
id_project id_developer id
name project_id id_developer
name email
---------- ------------- ------------
因此,既然开发者表中已经有了数据,那么让我们先删除表电子邮件,然后以正确的方式重新创建它。您将需要执行:
drop table email;
create table dev_email( -- changed the name because there is a field with same name
id INTEGER AUTO_INCREMENT NOT NULL,
id_developer INTEGER NOT NULL, -- this column should be the same type
-- as id_developer in the table developers
email VARCHAR(150) NOT NULL
PRIMARY KEY pk_email (id),
CONSTRAINT uk_developer_email UNIQUE (id_developer, email), -- that will avoid duplicates,
CONSTRAINT fk_dev FOREIGN KEY (developer_id)
REFERENCES developers(id_developer)
ON UPDATE RESTRICT ON DELETE RESTRICT
);
现在让我们用正确的数据填充此表:
INSERT INTO dev_email (id_developer, email)
SELECT min(id_developer), email
FROM developers
GROUP BY email;
之后,我们必须从developers表中删除重复的数据,如下所示:
DELETE FROM developers d
WHERE NOT EXIST (SELECT 1
FROM dev_email de
WHERE de.id_developer = d.id_developer);
然后,我们删除developers表中不再需要的列:
这将为您提供一个适当的规范化模型
现在,如果您需要检索连接了所有电子邮件的开发人员,这比拆分电子邮件更简单,您只需执行以下操作:
SELECT d.id_developer,
d.name,
GROUP_CONCAT(e.email, ', ') as emails
FROM developers d
INNER JOIN dev_email e
ON d.id_developer = e.id_developer
GROUP BY d.id_developer,
d.name
附言:所有这些都是我自己想出来的,为了安全起见,请先在测试环境中运行一个当前数据库的副本。应该没问题,但安全总比抱歉好,对吧 为什么要尝试对数据进行反规范化?你不应该那样做。@JorgeCampos,我在这里执行Oliva的策略。我必须识别具有不同电子邮件ID的相同开发人员。我将把它插入另一个表中作为记录。对不起,我不知道,Oliva的策略是什么?你有关于它的文章吗?有,我有关于它的研究论文。该策略说,即使一个人有不同的电子邮件地址,他也会在注册过程中提到相同的名字。现在我必须在这里实现这一点。我已经尽力解释了这个问题。现在有什么可能的解决方案来实现这个问题,您当前尝试的查询意味着project_id是用户id,那么developer表是什么呢?我认为用户id实际上应该是开发者id,对吗?如果没有,请澄清!您好,我在唯一键附近收到错误未识别的语句类型,需要逗号或右括号。我正在努力修复它。我会再打给你哦,对不起,我刚才在unique key命令后漏掉了一个逗号。我会编辑的。哈哈哈,我真的加了逗号。。。在注释xDI修复了唯一的语法之后,它就错了。现在应该没事了。您在聊天中提到的错误是因为引用的列不是主键,或者与我在评论中提到的类型不同。请参阅此线程:
SELECT d.id_developer,
d.name,
GROUP_CONCAT(e.email, ', ') as emails
FROM developers d
INNER JOIN dev_email e
ON d.id_developer = e.id_developer
GROUP BY d.id_developer,
d.name