mysql - 插入一列 DISTINCT,以及从一个表到另一个表的相应其他列

标签 mysql database

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

    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/

相关文章:

java - OpenShift 上到 MySQL 的 JDBC 连接池

PHP、MySQL : Problem retrieving image url strings from database

mysql - SQL Server 连接连接

mysql - 多个插入和选择到单个查询中

mysql - 什么时候查询结果是非标量的?

mysql - 如果另一个查询编辑了这些结果,数据库如何维护这些结果

mysql - PhpStorm 可以将 MySQL 数据库转储到 sql 文件中吗?

php - 如何使用 PHP 找出多语句 mysql_query 的哪一部分被匹配?

mysql多存储过程更新

mysql - Laravel 5.1 - 连接到 MySQL 数据库 (MAMP)