我的数据库查询有问题。我有三个表项目、开发人员和电子邮件。在开发人员表中,有很多行名称相同但电子邮件不同。我必须在电子邮件表中插入不同的名称,但所有电子邮件(在它们所属的名称行中),即
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
---------- ------------- ------------
因此,既然您已经在 developers
表中拥有了数据,那么我们首先要删除表 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
表中不再需要的列:
ALTER TABLE developers DROP COLUMN email;
这应该给你一个正确的标准化模型。
现在,如果您需要检索包含所有电子邮件的开发人员(这比拆分邮件更简单),您只需执行以下操作:
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
PS.:这一切都是我凭空想象出来的,请先在测试环境中运行它(为了安全起见,请复制当前数据库的副本)。应该没问题,但安全总比后悔好,对吧?
关于mysql - 插入一列 DISTINCT,以及从一个表到另一个表的相应其他列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43989338/