使用php循环更新MySQL表

时间:2017-04-13 22:10:32

标签: mysql

鉴于以下mysql表,我在这里附上一个示例:

+------+-----------+-------------+-------------------+
| f_id | sub_id    | field_name  | field_val         |
+------+-----------+-------------+-------------------+
| 256  | 15        | Email:      | pete@abba.com     |
| 257  | 15        | Name:       | Peter             |
| 258  | 15        | Page:       | home/contact.html |
| 259  | 16        | Email:      | john@xyz.com      |
| 260  | 16        | Name:       | John              |
| 261  | 16        | Page:       | page-example.html |
| 262  | 17        | Email:      | mary@cococo.net   |
| 263  | 17        | Name:       | Mary              |
| 264  | 17        | Page:       | home/service.html |
+------+-----------+-------------+-------------------+

我需要在field_val时评估field_name LIKE 'Email:'值并获取公司名称,使用存储邮件扩展名和公司名称之间关系的现有数组比较电子邮件扩展名:

array(
'abba.com' => 'Abba INC.',
'xyz.com' => 'Xyz S.A.',
'cococo.net' => 'Cococo Ltd.'
);

并转换下表中的第一个表:

+------+-----------+-------------+-------------------+
| f_id | sub_id    | field_name  | field_val         |
+------+-----------+-------------+-------------------+
| 256  | 15        | Email:      | pete@abba.com     |
| 257  | 15        | Name:       | Peter             |
| 258  | 15        | Company:    | Abba INC.         |
| 259  | 16        | Email:      | john@xyz.com      |
| 260  | 16        | Name:       | John              |
| 261  | 16        | Company:    | Xyz S.A.          |
| 262  | 17        | Email:      | mary@cococo.net   |
| 263  | 17        | Name:       | Mary              |
| 264  | 17        | Company:    | Cococo Ltd.       |
+------+-----------+-------------+-------------------+

因此,我必须将field_name的{​​{1}}值更改为Page:,而不更改Company:,并指定通过f_id获得的field_val对应值提到的数组。

感谢。

3 个答案:

答案 0 :(得分:0)

我认为在第二个表中你会改变“f_id”列的值。我认为您应首先评估此列是否可自动递增,因为您需要做的是在名为“公司”的匹配中的“名称:”之后添加记录,不是吗?在任何情况下,“f_id”都不是自动递增的,事情会容易得多。

另一方面,我会告诉你以三种可能的方式解决它:

  1. 完全截断表并在通过“php”成功遍历数组后重新插入新记录。这将是一个以后的解决方案,但是如果您正在营地“f_id”处理一个值,如前所述,可以自行增量,这是有效的。

  2. 如果“f_id”列不能自动增量,则必须在找到匹配项后保存所有记录(包括最后一个ID)。有了这个,你将不得不删除它们,然后插入“公司”。在此之后,您将不得不重新更新您的表以插入您删除的记录。

  3. 如果您找到匹配项,我建议您将“f_id”的值保存在某个名为“公司”的表中,您可以在其中存储一些您认为可以直接与公司相关的“ID” 。在这种情况下,我会建议您调查关系数据库的主题。

  4. 运气。

答案 1 :(得分:0)

您可以将关联数组转换为SQL CASE表达式,以根据相关行中的电子邮件分配相应的新名称。

UPDATE yourTable AS t1
JOIN yourTable AS t2 ON t1.sub_id = t2.sub_id
SET t1.field_name = 'Company:', 
    t1.field_value = CASE 
        WHEN t2.field_value LIKE '%@abba.com' THEN 'Abba, INC.'
        WHEN t2.field_value LIKE '%@xyz.com' THEN 'Xyz S.A.'
        WHEN t2.field_value LIKE '%@cococo.net' THEN 'Cococo Ltd.'
    END
WHERE t1.field_name = 'Page:'
AND t2.field_name = 'Email:'
AND (t2.field_value LIKE '%@abba.com' 
    OR t2.field_value LIKE '%@xyz.com'
    OR t2.field_value LIKE '%@cococo.net')

在PHP中,您可以动态构建查询:

$cases = array();
$likes = array();
foreach ($array as $domain => $company) {
    $cases[] = "WHEN t2.field_value LIKE '%@$domain' THEN '$company'";
    $likes[] = "t2.field_value LIKE '%@$domain'";
}
$cases_string = implode(' ', $cases);
$likes_string = implode(' OR ', $likes);
$sql = "UPDATE yourTable AS t1
        JOIN yourTable AS t2 ON t1.sub_id = t2.sub_id
        SET t1.field_name = 'Company:', 
            t1.field_value = CASE $cases_string END
        WHERE t1.field_name = 'Page:'
        AND t2.field_name = 'Email:'
        AND ($likes_string)";

答案 2 :(得分:0)

这应该将电子邮件记录更新为公司记录。它确实需要您的数组在表中。

UPDATE `fields` f
SET `field_name` = `new_field_name`, 
    `field_val` =  (SELECT 
        c.`company_name`
    FROM `companies` c 
    WHERE LOWER(SUBSTR(f.`field_val`,LOCATE('@',f.`field_val`) + 1,100)) = LOWER(c.`company_email`))
    AND f.`field_name` = 'Email:')
WHERE `field_name` = 'Email:'