mysql - 在子查询中使用同一张表的 UPDATE 语句

标签 mysql sql myisam

SELECT
    vl1.phone_number,
    vl1.first_name,
    CONCAT(
        SUBSTRING(
            (
            SELECT
                vl2.phone_number 
            FROM
                list as vl2
            WHERE
                vl2.phone_number LIKE CONCAT( SUBSTRING( vl1.phone_number FROM 1 FOR 3 ), "%" ) 
            ORDER BY
                RAND( ) 
                LIMIT 1 
            ) 
        FROM
            1 FOR 6 
        ),
        FLOOR( RAND( ) * ( 8999 ) ) + 1000 
    ) AS autogenNumber 
FROM
    list as vl1
LIMIT 1

我得到的结果是

phone_number | firstname | autogenNumber

autogenNumber 是通过首先搜索共享前三位数字的其他数字生成的。然后从该号码中选取 6 位数字,并将另外 4 位随机数字替换到末尾。

上面的 sql 查询完全按照我的需要生成了 autogen 编号。

但是,当我想使用下面的类似查询更新此列表中的列 security_phrase 时,问题就出现了。

UPDATE list as vl1
SET vl1.security_phrase = (
    CONCAT(
        SUBSTRING(
            (
                SELECT
                    vl2.phone_number 
                FROM
                    list AS vl2 
                WHERE
                    vl2.phone_number LIKE CONCAT( SUBSTRING(phone_number FROM 1 FOR 3 ), "%" ) 
                ORDER BY
                    RAND( ) 
                    LIMIT 1 
                ) 
            FROM
                1 FOR 6 
            ),
            FLOOR( RAND( ) * ( 8999 ) ) + 1000 
        ) 
    ) 
    LIMIT 10

给我一​​个错误:

1093 - Table 'vl1' is specified twice, both as a target for 'UPDATE' and as a separate source for data

我也试过

UPDATE list AS vl1
JOIN list AS vl2 

SET vl1.security_phrase = (
    CONCAT( SUBSTRING( vl2.phone_number FROM 1 FOR 6 ), FLOOR( RAND( ) * ( 8999 ) ) + 1000 ) 
) 
WHERE
    vl2.phone_number LIKE CONCAT( SUBSTRING( vl1.phone_number FROM 1 FOR 3 ), "%" ) 

不工作,没有给出预期的结果......

任何帮助

最佳答案

MySQL 不允许在另一个子查询中再次引用 正在更新 的表,除非它在 FROM 子句中 ( Derived Table ) .

现在,在您的特定情况下,我们需要将完整的 SELECT 查询 block 作为派生表。正如在聊天中讨论的那样,lead_id 是您的主键,因此我们将使用 PK 重新加入以相应地更新行。

UPDATE list AS t1 
JOIN 
(
  SELECT
    vl1.lead_id,
    CONCAT(
        SUBSTRING(
            (
            SELECT
                vl2.phone_number 
            FROM
                list as vl2
            WHERE
                vl2.phone_number LIKE CONCAT( SUBSTRING( vl1.phone_number FROM 1 FOR 3 ), "%" ) 
            ORDER BY
                RAND( ) 
                LIMIT 1 
            ) 
        FROM
            1 FOR 6 
        ),
        FLOOR( RAND( ) * ( 8999 ) ) + 1000 
    ) AS autogenNumber 
  FROM
    list as vl1
) AS dt 
  ON dt.lead_id = t1.lead_id 
SET t1.security_phrase = dt.autogenNumber

关于mysql - 在子查询中使用同一张表的 UPDATE 语句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53503205/

相关文章:

Mysql CHECKSUM TABLE 不适用于 ndbcluster

mysql - 在 bool 模式下选择匹配无法正常工作

php - 针对 mysql 注入(inject)的文本区域保护 - PHP

mysql - 员工详细信息及其工作类型

mysql 匹配一列上的重复项,仅在另一列上不同

php - 如何使用 PHP/SQL 并行运行两个 sql 查询?

sql - 在 Ruby 中使用 SQL 文件

sql - 按结果出现的半径数对 ST_DWithin 结果进行排序

mysql - 为mysql中的out参数分配变量值

php - 10,000,000行数据库的最佳存储引擎