根据连接到表的结果更新MySQL表

根据连接到表的结果更新MySQL表,mysql,email,sql-update,subquery,left-join,Mysql,Email,Sql Update,Subquery,Left Join,我有三个表格、电子邮件、个人详细信息和数据提供者。基本上,我的所有用户id、电子邮件和当前分配的数据提供者id都存储在电子邮件表中 第二个表person_details包含由多个数据提供者收集的人口统计信息,每一行由与第三个表data_providers.id相关的emails_id标识 第三个表data_providers包含我的每个数据提供程序id、名称和优先级 基本上,一个用户的信息可以从多个来源收集,我需要更新电子邮件集数据提供者id=基于一个选择,该选择将连接person\u deta

我有三个表格、电子邮件、个人详细信息和数据提供者。基本上,我的所有用户id、电子邮件和当前分配的数据提供者id都存储在电子邮件表中

第二个表person_details包含由多个数据提供者收集的人口统计信息,每一行由与第三个表data_providers.id相关的emails_id标识

第三个表data_providers包含我的每个数据提供程序id、名称和优先级

基本上,一个用户的信息可以从多个来源收集,我需要更新电子邮件集数据提供者id=基于一个选择,该选择将连接person\u details表和data\u providers表,按数据提供者排序。优先级DESC然后person\u details.import\u date ASC并使用第一个值(最高优先级,然后是最早的导入日期)

我试图构建查询,但我的子查询返回了不止一行。这个查询有点让我不知所措,希望有经验丰富的复杂查询人员能够为我指明正确的方向

UPDATE emails 
SET emails.data_providers_id = 
    SELECT person_details.data_providers_id 
    FROM person_details 
    LEFT JOIN data_providers ON person_details.data_providers_id = data_providers.id
    ORDER BY data_providers.percent_payout ASC, person_details.import_date ASC ;
如果这有帮助的话,下面是关于这三张表的一些详细信息。如有任何指导,将不胜感激。提前感谢:)

电子邮件表:

+-------------------+---------------------+------+-----+---------------------+----------------+
| Field             | Type                | Null | Key | Default             | Extra          |
+-------------------+---------------------+------+-----+---------------------+----------------+
| id                | int(11) unsigned    | NO   | PRI | NULL                | auto_increment |
| data_providers_id | tinyint(3) unsigned | NO   | MUL | NULL                |                |
| email             | varchar(255)        | NO   | UNI | NULL                |                |
+-------------------+---------------------+------+-----+---------------------+----------------+
个人信息:

+-------------------+---------------------+------+-----+---------------------+-------+
| Field             | Type                | Null | Key | Default             | Extra |
+-------------------+---------------------+------+-----+---------------------+-------+
| emails_id         | int(11) unsigned    | NO   | PRI | NULL                |       |
| data_providers_id | tinyint(3) unsigned | NO   | PRI | NULL                |       |
| fname             | varchar(255)        | YES  |     | NULL                |       |
| lname             | varchar(255)        | YES  |     | NULL                |       |
| address_line1     | text                | YES  |     | NULL                |       |
| address_line2     | text                | YES  |     | NULL                |       |
| city              | varchar(255)        | YES  |     | NULL                |       |
| state             | varchar(2)          | YES  |     | NULL                |       |
| zip5              | varchar(5)          | YES  |     | NULL                |       |
| zip4              | varchar(4)          | YES  |     | NULL                |       |
| home_phone        | varchar(10)         | YES  |     | NULL                |       |
| mobile_phone      | varchar(10)         | YES  |     | NULL                |       |
| work_phone        | varchar(10)         | YES  |     | NULL                |       |
| dob               | date                | YES  |     | NULL                |       |
| gender            | varchar(1)          | YES  |     | NULL                |       |
| ip_address        | varchar(15)         | NO   |     | NULL                |       |
| source            | varchar(255)        | NO   |     | NULL                |       |
| optin_datetime    | datetime            | NO   | MUL | NULL                |       |
| import_date       | timestamp           | NO   |     | 0000-00-00 00:00:00 |       |
+-------------------+---------------------+------+-----+---------------------+-------+
数据提供者表:

+-----------------+---------------------+------+-----+---------+----------------+
| Field           | Type                | Null | Key | Default | Extra          |
+-----------------+---------------------+------+-----+---------+----------------+
| id              | tinyint(3) unsigned | NO   | PRI | NULL    | auto_increment |
| name            | varchar(255)        | NO   |     | NULL    |                |
| precedence      | int(2)              | YES  |     | 0       |                |
+-----------------+---------------------+------+-----+---------+----------------+

要使用
选择
作为表达式,必须将其放在括号中。要获得第一个值,请使用
限制1

UPDATE emails 
SET emails.data_providers_id = (
    SELECT person_details.data_providers_id 
    FROM person_details 
    LEFT JOIN data_providers ON person_details.data_providers_id = data_providers.id
    WHERE person_details.emails_id = emails.id
    ORDER BY data_providers.percent_payout ASC, person_details.import_date ASC
    LIMIT 1) ;

在没有一个。。。是NULL语句,更新时的左连接有点weird@Strawberry,谢谢你的提醒。幸运的是,在这个表上,查询所需的所有列都不是NULL.hm-您缺少了一个点。您的选择工作得很好,因为它返回一行,但是它将使用相同的单行结果更新电子邮件表中的每个记录。我需要根据emails.id匹配person\u details.emails\u id独立更新emails表的每一行。我已将答案更改为使用相关子查询。很抱歉,回头看这个根本不清楚的问题。非常感谢您的帮助,非常感谢!现在看起来很简单,你把它摆出来了,不知道为什么我总是在这个问题上绊倒。