如何避免在嵌套循环中执行mysql查询?

时间:2012-09-27 22:07:20

标签: php mysql

我在分配任务时遇到了一些问题。

我有这个旧的phpmynewsletter数据库(MySQL后端)。

基本上所有电子邮件都保存在具有以下结构的表中:

    email   varchar(255)
    list_id int(11)
    hash    varchar(255)
    disclaimer1 tinyint(1)
    disclaimer2 tinyint(1)
    gender  char(1)
    dob date
    region  varchar(50)

因此,同一封电子邮件可以在表格中多次出现,即在不同的简报中订阅(由 list_id 标识)

我需要做的是更新记录,以便字段免责声明1 免责声明2 性别 dob 对于与其他list_id注册的相同电子邮件,特定 list_id 区域相同。

例如:

    email: email1(at)gmail.com
    list_id: 1
    disclaimer1: 0
    disclaimer2: 0
    gender: M
    dob: 1975-05-02
    region: Portugal

    email: email2(at)gmail.com
    list_id: 33
    disclaimer1: 1
    disclaimer2: 0
    gender: M
    dob: 1975-05-02
    region: Portugal

如何用list_id 33更新带有list_id 1记录的正确值的记录?

我正在使用PHP,我相信在循环中运行更新查询是不好的做法。该表有大约610000条记录。

希望有人能给我一些关于如何完成这项任务的见解。

谢谢, 马里奥

1 个答案:

答案 0 :(得分:3)

@bigman你发布的内容似乎是对的,但我想问题是如何使用相同的电子邮件更改类似于list_id:1的所有其他数据。

UPDATE my_table t,
 (
    SELECT
        email,
        disclaimer1,
        disclaimer2,
        gender,
        dob,
        region
    FROM
        my_table
    WHERE
        list_id = 1
) t1
SET 
 t.disclaimer1 = t1.disclaimer1,
 t.gender = t1.gender,
 t.dob = t1.dob,
 t.region = t1.region
WHERE
   t.email = t1.email

我想这应该适用于所有具有list_id:1电子邮件地址的条目。