Оператор UPDATE, использующий ту же таблицу в подзапросе - PullRequest
0 голосов
/ 27 ноября 2018
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-запрос генерирует номер автогена точно так, как мне нужно.

Однако теперь возникает проблема, когда я хочу обновить столбец 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 - Таблица 'vl1' указывается дважды, как в качестве цели для 'ОБНОВЛЕНИЕ', так и в качестве отдельного источника для данных

Я также пытался

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 ), "%" ) 

Не работает и не дает ожидаемых результатов ...

Любая помощь

1 Ответ

0 голосов
/ 27 ноября 2018

MySQL не разрешает ссылаться на таблицу , которая обновляется , снова в другом подзапросе, , если не находится внутри предложения FROM ( Производная таблица ).

Теперь, в вашем конкретном случае, нам нужно будет поместить полный блок запроса SELECT в качестве производной таблицы.Как уже говорилось в чате, 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
...