簡體   English   中英

根據結果​​更新MySQL表以加入表

[英]Update MySQL table based on results for joining to tables

我有三個表,電子郵件,person_details和data_providers。 基本上,我所有的用戶ID,電子郵件和當前分配的data_providers_id都存儲在電子郵件表中。

第二個表person_details包含由多個數據提供者收集的人口統計信息,每一行都由與emails.id相關的emails_id標識,而與第三個表data_providers.id相關的email_id

第三個表data_providers包含我的每個數據提供者ID,名稱和優先級。

基本上,可以從多個來源收集用戶信息,而我需要UPDATE emails set data_providers_id =選擇UPDATE emails set data_providers_id =基礎,該選擇將對person_details表和data_providers表進行排序,然后按data_providers.precedence DESC,再按person_details.import_date ASC進行排序,並使用第一個值(最高優先級,然后是最早的import_date)。

我試圖建立查詢,但是我的子查詢返回的行多。 這個查詢讓我有些頭疼,希望對復雜查詢更有經驗的人可以為我指明正確的方向。

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                |                |
+-------------------+---------------------+------+-----+---------------------+----------------+

person_details:

+-------------------+---------------------+------+-----+---------------------+-------+
| 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 |       |
+-------------------+---------------------+------+-----+---------------------+-------+

data_providers表:

+-----------------+---------------------+------+-----+---------+----------------+
| 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       |                |
+-----------------+---------------------+------+-----+---------+----------------+

要將SELECT用作表達式,必須將其放在括號中。 要獲得第一個值,請使用LIMIT 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) ;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM