Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/60.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 插入一个不同的列,将对应的其他列从一个表插入到另一个表_Mysql_Database - Fatal编程技术网

Mysql 插入一个不同的列,将对应的其他列从一个表插入到另一个表

Mysql 插入一个不同的列,将对应的其他列从一个表插入到另一个表,mysql,database,Mysql,Database,我对数据库查询有问题。我有三个表格项目,开发人员和电子邮件。在developers表中,有许多行的名称相同,但电子邮件不同。我必须插入不同的名称,但所有的电子邮件都位于电子邮件表中它们所属的名称行中,即 example ///////////////////////////////////////////// developers table have records:- id_developer project_id name email

我对数据库查询有问题。我有三个表格项目,开发人员和电子邮件。在developers表中,有许多行的名称相同,但电子邮件不同。我必须插入不同的名称,但所有的电子邮件都位于电子邮件表中它们所属的名称行中,即

    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